1use serde::{Deserialize, Serialize};
4use tsify::Tsify;
5
6use catlog::wd;
7use catlog::zero::{LabelSegment, NameSegment, QualifiedName};
8
9#[derive(Serialize, Deserialize, Tsify)]
13#[tsify(into_wasm_abi, from_wasm_abi)]
14pub struct UWD {
15 #[serde(rename = "outerPorts")]
17 pub outer_ports: Vec<UWDPort>,
18
19 pub boxes: Vec<UWDBox>,
21
22 pub junctions: Vec<QualifiedName>,
24}
25
26#[derive(Serialize, Deserialize, Tsify)]
28#[tsify(into_wasm_abi, from_wasm_abi)]
29pub struct UWDBox {
30 pub name: NameSegment,
32
33 pub label: LabelSegment,
35
36 pub ports: Vec<UWDPort>,
38}
39
40#[derive(Serialize, Deserialize, Tsify)]
44#[tsify(into_wasm_abi, from_wasm_abi, missing_as_null)]
45pub struct UWDPort {
46 pub name: NameSegment,
48
49 pub label: LabelSegment,
51
52 pub junction: Option<QualifiedName>,
54}
55
56pub fn serialize_uwd<T: Clone + Eq>(uwd: &wd::UWD<T, QualifiedName>) -> UWD {
58 let outer_ports = uwd
59 .outer_ports()
60 .iter()
61 .map(|(&name, &(label, _))| UWDPort {
62 name,
63 label,
64 junction: uwd.get_outer(name).cloned(),
65 })
66 .collect();
67
68 let boxes = uwd
69 .boxes()
70 .map(|(&box_name, &box_label, ports)| UWDBox {
71 name: box_name,
72 label: box_label,
73 ports: ports
74 .iter()
75 .map(|(&port_name, &(port_label, _))| UWDPort {
76 name: port_name,
77 label: port_label,
78 junction: uwd.get(box_name, port_name).cloned(),
79 })
80 .collect(),
81 })
82 .collect();
83
84 let junctions = uwd.junctions().collect();
85
86 UWD { outer_ports, boxes, junctions }
87}