Skip to main content

cityjson_types/
query.rs

1use crate::relational::RelationalAccess;
2use crate::v2_0::OwnedCityModel;
3
4/// Scalar summary over an owned city model.
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub struct ModelSummary {
7    pub cityobject_count: u32,
8    pub geometry_count: u32,
9    pub geometry_template_count: u32,
10    pub vertex_count: u32,
11    pub template_vertex_count: u32,
12    pub uv_vertex_count: u32,
13    pub semantic_count: u32,
14    pub material_count: u32,
15    pub texture_count: u32,
16    pub symbol_count: u32,
17    pub has_metadata: bool,
18    pub has_transform: bool,
19}
20
21#[must_use]
22pub fn summary(model: &OwnedCityModel) -> ModelSummary {
23    let relational = model.relational();
24    let raw = relational.raw();
25    let symbol_count = u32::try_from(relational.snapshot().symbols().len()).unwrap_or(u32::MAX);
26
27    ModelSummary {
28        cityobject_count: u32::try_from(relational.cityobjects().len()).unwrap_or(u32::MAX),
29        geometry_count: u32::try_from(raw.geometries().len()).unwrap_or(u32::MAX),
30        geometry_template_count: u32::try_from(model.geometry_template_count()).unwrap_or(u32::MAX),
31        vertex_count: u32::try_from(raw.vertices().len()).unwrap_or(u32::MAX),
32        template_vertex_count: u32::try_from(raw.template_vertices().len()).unwrap_or(u32::MAX),
33        uv_vertex_count: u32::try_from(raw.uv_coordinates().len()).unwrap_or(u32::MAX),
34        semantic_count: u32::try_from(raw.semantics().len()).unwrap_or(u32::MAX),
35        material_count: u32::try_from(raw.materials().len()).unwrap_or(u32::MAX),
36        texture_count: u32::try_from(raw.textures().len()).unwrap_or(u32::MAX),
37        symbol_count,
38        has_metadata: model.metadata().is_some(),
39        has_transform: model.transform().is_some(),
40    }
41}