Files
Genarrative/server-rs/crates/platform-hyper3d/src/response/submit.rs
T
2026-05-26 13:18:13 +08:00

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
}