65 lines
2.1 KiB
Rust
65 lines
2.1 KiB
Rust
use serde_json::Value;
|
|
|
|
use crate::{
|
|
error::Hyper3dError,
|
|
types::{HYPER3D_PROVIDER, RODIN_GEN2_TIER},
|
|
};
|
|
|
|
pub(crate) fn build_submit_response(
|
|
mode: shared_contracts::hyper3d::Hyper3dGenerationMode,
|
|
response: Value,
|
|
) -> Result<shared_contracts::hyper3d::Hyper3dTaskSubmitResponse, Hyper3dError> {
|
|
let task_uuid =
|
|
super::parsing::find_root_string_by_keys(&response, &["uuid", "task_uuid", "taskUuid"])
|
|
.or_else(|| {
|
|
super::parsing::find_first_string_by_keys(&response, &["task_uuid", "taskUuid"])
|
|
})
|
|
.ok_or_else(|| Hyper3dError::missing_field("Hyper3D 已响应,但未返回任务 uuid"))?;
|
|
let subscription_key = super::parsing::find_root_string_by_keys(
|
|
&response,
|
|
&["subscription_key", "subscriptionKey"],
|
|
)
|
|
.or_else(|| {
|
|
super::parsing::find_first_string_by_keys(
|
|
&response,
|
|
&["subscription_key", "subscriptionKey"],
|
|
)
|
|
})
|
|
.ok_or_else(|| Hyper3dError::missing_field("Hyper3D 已响应,但未返回 subscription_key"))?;
|
|
let job_uuids = extract_job_uuids(&response);
|
|
let message = super::parsing::find_first_string_by_keys(&response, &["message", "detail"]);
|
|
|
|
Ok(shared_contracts::hyper3d::Hyper3dTaskSubmitResponse {
|
|
ok: true,
|
|
provider: HYPER3D_PROVIDER.to_string(),
|
|
mode,
|
|
task_uuid,
|
|
subscription_key,
|
|
job_uuids,
|
|
message,
|
|
tier: RODIN_GEN2_TIER.to_string(),
|
|
})
|
|
}
|
|
|
|
fn extract_job_uuids(payload: &Value) -> Vec<String> {
|
|
let mut job_uuids = Vec::new();
|
|
if let Some(jobs) = payload.get("jobs") {
|
|
for uuid in super::parsing::collect_strings_by_keys(
|
|
jobs,
|
|
&["uuid", "task_uuid", "taskUuid", "uuids"],
|
|
) {
|
|
if !job_uuids.contains(&uuid) {
|
|
job_uuids.push(uuid);
|
|
}
|
|
}
|
|
}
|
|
for uuid in
|
|
super::parsing::collect_strings_by_keys(payload, &["job_uuids", "jobUuids", "uuids"])
|
|
{
|
|
if !job_uuids.contains(&uuid) {
|
|
job_uuids.push(uuid);
|
|
}
|
|
}
|
|
job_uuids
|
|
}
|