use super::mesh::MeshData;
use crate::georeferencing::Georeferencing;
use crate::symbolic::SymbolicData;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ParseResponse {
pub cache_key: String,
pub meshes: Vec<MeshData>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mesh_coordinate_space: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub site_transform: Option<Vec<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub building_transform: Option<Vec<f64>>,
pub metadata: ModelMetadata,
pub stats: ProcessingStats,
#[serde(default, skip_serializing_if = "SymbolicData::is_empty")]
pub symbolic_data: SymbolicData,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ModelMetadata {
pub schema_version: String,
pub entity_count: usize,
pub geometry_entity_count: usize,
pub coordinate_info: CoordinateInfo,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub length_unit_scale: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub georeferencing: Option<Georeferencing>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct CoordinateInfo {
pub origin_shift: [f64; 3],
pub is_geo_referenced: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QuickMetadataEntitySummary {
pub express_id: u32,
pub type_name: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub global_id: Option<String>,
pub kind: String,
pub has_children: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub element_count: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub elevation: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QuickMetadataSpatialNode {
#[serde(flatten)]
pub summary: QuickMetadataEntitySummary,
pub children: Vec<QuickMetadataSpatialNode>,
pub elements: Vec<QuickMetadataEntitySummary>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QuickMetadataBootstrap {
pub schema_version: String,
pub entity_count: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub spatial_tree: Option<QuickMetadataSpatialNode>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ProcessingStats {
pub total_meshes: usize,
pub total_vertices: usize,
pub total_triangles: usize,
pub parse_time_ms: u64,
pub entity_scan_time_ms: u64,
pub lookup_time_ms: u64,
pub preprocess_time_ms: u64,
pub geometry_time_ms: u64,
pub total_time_ms: u64,
pub from_cache: bool,
#[serde(default)]
pub total_csg_failures: u64,
#[serde(default)]
pub products_with_failures: u64,
}