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 { 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 { 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 }