use crate::{ error::Hyper3dError, request::normalize::{normalize_addons, normalize_bbox_condition, normalize_enum}, types::{ DEFAULT_GEOMETRY_FILE_FORMAT, DEFAULT_MATERIAL, DEFAULT_MESH_MODE, DEFAULT_QUALITY, SubmitOptions, }, }; pub(crate) fn build_submit_options_from_text( payload: &shared_contracts::hyper3d::Hyper3dTextToModelRequest, ) -> Result { SubmitOptions::new( payload.seed, payload.geometry_file_format.as_deref(), payload.material.as_deref(), payload.quality.as_deref(), payload.mesh_mode.as_deref(), payload.addons.clone(), payload.bbox_condition.clone(), payload.preview_render, ) } pub(crate) fn build_submit_options_from_image( payload: &shared_contracts::hyper3d::Hyper3dImageToModelRequest, ) -> Result { SubmitOptions::new( payload.seed, payload.geometry_file_format.as_deref(), payload.material.as_deref(), payload.quality.as_deref(), payload.mesh_mode.as_deref(), payload.addons.clone(), payload.bbox_condition.clone(), payload.preview_render, ) } impl SubmitOptions { #[allow(clippy::too_many_arguments)] pub(crate) fn new( seed: Option, geometry_file_format: Option<&str>, material: Option<&str>, quality: Option<&str>, mesh_mode: Option<&str>, addons: Vec, bbox_condition: Option>, preview_render: Option, ) -> Result { Ok(Self { seed, geometry_file_format: normalize_enum( geometry_file_format, DEFAULT_GEOMETRY_FILE_FORMAT, &["glb", "usdz", "fbx", "obj", "stl"], "geometryFileFormat", )?, material: normalize_enum( material, DEFAULT_MATERIAL, &["PBR", "Shaded", "All"], "material", )?, quality: normalize_enum( quality, DEFAULT_QUALITY, &["high", "medium", "low", "extra-low"], "quality", )?, mesh_mode: normalize_enum(mesh_mode, DEFAULT_MESH_MODE, &["Quad", "Raw"], "meshMode")?, addons: normalize_addons(addons)?, bbox_condition: normalize_bbox_condition(bbox_condition)?, preview_render: preview_render.unwrap_or(true), }) } } pub(crate) fn build_common_submit_fields( form: reqwest::multipart::Form, options: &SubmitOptions, ) -> Result { let mut form = form .text( "geometry_file_format", options.geometry_file_format.to_string(), ) .text("material", options.material.to_string()) .text("quality", options.quality.to_string()) .text("mesh_mode", options.mesh_mode.to_string()) .text("preview_render", options.preview_render.to_string()); if let Some(seed) = options.seed { form = form.text("seed", seed.to_string()); } for addon in &options.addons { form = form.text("addons", addon.to_string()); } if let Some(bbox_condition) = &options.bbox_condition { form = form.text( "bbox_condition", serde_json::to_string(bbox_condition).map_err(|error| { Hyper3dError::invalid_request( Some("bboxCondition"), format!("bboxCondition 序列化失败:{error}"), ) })?, ); } Ok(form) }