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)]
10#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
11pub struct ObjectSummary {
12    /// Element type name -> count, e.g. `{"buses": 118, "branches": 186}`.
13    #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
14    pub elements: BTreeMap<String, u64>,
15    #[serde(default, skip_serializing_if = "Option::is_none")]
16    pub topology: Option<ObjectTopology>,
17    #[serde(default, skip_serializing_if = "Option::is_none")]
18    pub units: Option<ObjectUnits>,
19}
20
21#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
22#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
23pub struct ObjectTopology {
24    #[serde(default, skip_serializing_if = "Option::is_none")]
25    pub connected_components: Option<u64>,
26    /// Reference bus ids as strings (balanced ids are integers, multiconductor
27    /// ids are strings; strings cover both).
28    #[serde(default, skip_serializing_if = "Vec::is_empty")]
29    pub reference_buses: Vec<String>,
30}
31
32#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
33#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
34pub struct ObjectUnits {
35    #[serde(default, skip_serializing_if = "Option::is_none")]
36    pub power: Option<String>,
37    #[serde(default, skip_serializing_if = "Option::is_none")]
38    pub angle: Option<String>,
39    #[serde(default, skip_serializing_if = "Option::is_none")]
40    pub base_mva: Option<f64>,
41}