Skip to main content

powerio_pkg/
summary.rs

1//! A human-oriented summary of the payload.
2
3use std::collections::BTreeMap;
4
5use serde::{Deserialize, Serialize};
6
7/// Element counts, topology, and unit conventions, for a quick read of a package
8/// without deserializing the whole payload.
9#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
10pub struct ObjectSummary {
11    /// Element type name -> count, e.g. `{"buses": 118, "branches": 186}`.
12    #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
13    pub elements: BTreeMap<String, u64>,
14    #[serde(default, skip_serializing_if = "Option::is_none")]
15    pub topology: Option<ObjectTopology>,
16    #[serde(default, skip_serializing_if = "Option::is_none")]
17    pub units: Option<ObjectUnits>,
18}
19
20#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
21pub struct ObjectTopology {
22    #[serde(default, skip_serializing_if = "Option::is_none")]
23    pub connected_components: Option<u64>,
24    /// Reference bus ids as strings (balanced ids are integers, multiconductor
25    /// ids are strings; strings cover both).
26    #[serde(default, skip_serializing_if = "Vec::is_empty")]
27    pub reference_buses: Vec<String>,
28}
29
30#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
31pub struct ObjectUnits {
32    #[serde(default, skip_serializing_if = "Option::is_none")]
33    pub power: Option<String>,
34    #[serde(default, skip_serializing_if = "Option::is_none")]
35    pub angle: Option<String>,
36    #[serde(default, skip_serializing_if = "Option::is_none")]
37    pub base_mva: Option<f64>,
38}