xidl_parser/versioning/map/
model.rs1use serde::{Deserialize, Serialize};
4use serde_json::Value;
5use std::collections::BTreeMap;
6
7#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
9pub struct VersionMap {
10 pub format: u32,
12 pub contract: String,
14 pub versions: Vec<MapVersion>,
16 pub steps: Vec<MapStep>,
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
22pub struct MapVersion {
23 pub id: String,
25 pub value: String,
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
31pub struct MapStep {
32 pub from: String,
34 pub to: String,
36 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
38 pub types: BTreeMap<String, TypeChange>,
39 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
41 pub operations: BTreeMap<String, Change>,
42}
43
44#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
46pub struct TypeChange {
47 pub change: ChangeKind,
49 #[serde(skip_serializing_if = "Option::is_none")]
51 pub kind: Option<String>,
52 #[serde(skip_serializing_if = "Option::is_none")]
55 pub details: Option<BTreeMap<String, Value>>,
56 #[serde(skip_serializing_if = "Option::is_none")]
58 pub from: Option<BTreeMap<String, Value>>,
59 #[serde(skip_serializing_if = "Option::is_none")]
61 pub to: Option<BTreeMap<String, Value>>,
62 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
64 pub members: BTreeMap<String, Change>,
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
69pub struct Change {
70 pub change: ChangeKind,
72 #[serde(skip_serializing_if = "Option::is_none")]
74 pub from: Option<BTreeMap<String, Value>>,
75 #[serde(skip_serializing_if = "Option::is_none")]
77 pub to: Option<BTreeMap<String, Value>>,
78}
79
80#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
82#[serde(rename_all = "lowercase")]
83pub enum ChangeKind {
84 Added,
86 Removed,
88 Changed,
90}
91
92#[derive(Debug, Clone, PartialEq)]
93pub(super) struct TypeSurface {
94 pub(super) kind: String,
95 pub(super) details: BTreeMap<String, Value>,
96 pub(super) members: BTreeMap<String, BTreeMap<String, Value>>,
97}
98
99pub(super) fn type_shape(surface: &TypeSurface) -> BTreeMap<String, Value> {
100 let mut shape = BTreeMap::from([("kind".to_string(), Value::String(surface.kind.clone()))]);
101 shape.extend(
102 surface
103 .details
104 .iter()
105 .map(|(key, value)| (key.clone(), value.clone())),
106 );
107 shape
108}
109
110pub(super) type TypeParts<'a> = (
111 &'a str,
112 &'a str,
113 BTreeMap<String, Value>,
114 BTreeMap<String, BTreeMap<String, Value>>,
115);
116
117#[derive(Debug, Clone, PartialEq)]
118pub(super) struct OperationSurface {
119 pub(super) descriptor: BTreeMap<String, Value>,
120 pub(super) params: BTreeMap<String, BTreeMap<String, Value>>,
121}