dpp-digital-link 0.9.0

GS1 Digital Link parser/builder and JSON-LD helpers for Odal Node
Documentation
//! Sector-data dispatch: routes a [`SectorData`] variant to its AAS submodel builder.

use dpp_domain::SectorData;

use crate::aas::mapper::json_value_to_element;
use crate::aas::model::AasSubmodel;

pub(crate) fn build_sector_submodel(sector_data: &SectorData, passport_id: &str) -> AasSubmodel {
    match sector_data {
        SectorData::Battery(b) => super::battery::build_battery_submodel(b, passport_id),
        SectorData::Textile(t) => super::textile::build_textile_submodel(t, passport_id),
        SectorData::Electronics(e) => {
            super::electronics::build_electronics_submodel(e, passport_id)
        }
        SectorData::Steel(d) => super::steel::build_steel_submodel(d, passport_id),
        SectorData::Construction(d) => {
            super::construction::build_construction_submodel(d, passport_id)
        }
        SectorData::Tyre(d) => super::tyre::build_tyre_submodel(d, passport_id),
        SectorData::Toy(d) => super::toy::build_toy_submodel(d, passport_id),
        SectorData::Aluminium(d) => super::aluminium::build_aluminium_submodel(d, passport_id),
        SectorData::Furniture(d) => super::furniture::build_furniture_submodel(d, passport_id),
        SectorData::Detergent(d) => super::detergent::build_detergent_submodel(d, passport_id),
        SectorData::UnsoldGoods(r) => {
            super::unsold_goods::build_unsold_goods_submodel(r, passport_id)
        }
        SectorData::Other(v) => {
            let elements = match v {
                serde_json::Value::Object(map) => map
                    .iter()
                    .filter(|(k, _)| k.as_str() != "sector")
                    .map(|(k, v)| json_value_to_element(k, v))
                    .collect(),
                _ => vec![],
            };
            AasSubmodel {
                id: format!("urn:odal-node:dpp:{passport_id}:sector-data"),
                id_short: "SectorData".into(),
                model_type: "Submodel".into(),
                kind: "Instance".into(),
                semantic_id: None,
                submodel_elements: elements,
            }
        }
        // Forward-compat: an unmodelled sector variant is rendered as a generic
        // submodel from its serialised fields (same shape as `Other`).
        other => {
            let value = serde_json::to_value(other).unwrap_or(serde_json::Value::Null);
            let elements = match value {
                serde_json::Value::Object(map) => map
                    .iter()
                    .filter(|(k, _)| k.as_str() != "sector")
                    .map(|(k, v)| json_value_to_element(k, v))
                    .collect(),
                _ => vec![],
            };
            AasSubmodel {
                id: format!("urn:odal-node:dpp:{passport_id}:sector-data"),
                id_short: "SectorData".into(),
                model_type: "Submodel".into(),
                kind: "Instance".into(),
                semantic_id: None,
                submodel_elements: elements,
            }
        }
    }
}