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,
14 pub contract: String,
16 pub versions: Vec<MapVersion>,
18 pub steps: Vec<MapStep>,
20}
21
22#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
24pub struct MapVersion {
25 pub id: String,
27 pub value: String,
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
33pub struct MapStep {
34 pub from: String,
36 pub to: String,
38 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
40 pub types: BTreeMap<String, TypeChange>,
41 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
43 pub operations: BTreeMap<String, Change>,
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
48pub struct TypeChange {
49 pub change: ChangeKind,
51 #[serde(skip_serializing_if = "Option::is_none")]
53 pub kind: Option<String>,
54 #[serde(skip_serializing_if = "Option::is_none")]
57 pub details: Option<BTreeMap<String, Value>>,
58 #[serde(skip_serializing_if = "Option::is_none")]
60 pub from: Option<BTreeMap<String, Value>>,
61 #[serde(skip_serializing_if = "Option::is_none")]
63 pub to: Option<BTreeMap<String, Value>>,
64 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
66 pub members: BTreeMap<String, Change>,
67}
68
69#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
71pub struct Change {
72 pub change: ChangeKind,
74 #[serde(skip_serializing_if = "Option::is_none")]
76 pub from: Option<BTreeMap<String, Value>>,
77 #[serde(skip_serializing_if = "Option::is_none")]
79 pub to: Option<BTreeMap<String, Value>>,
80}
81
82#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
84#[serde(rename_all = "lowercase")]
85pub enum ChangeKind {
86 Added,
88 Removed,
90 Changed,
92}
93
94#[derive(Debug, Clone, PartialEq)]
95pub(super) struct TypeSurface {
96 pub(super) kind: String,
97 pub(super) details: BTreeMap<String, Value>,
98 pub(super) members: BTreeMap<String, BTreeMap<String, Value>>,
99}
100
101pub(super) fn type_shape(surface: &TypeSurface) -> BTreeMap<String, Value> {
102 let mut shape = BTreeMap::from([("kind".to_string(), Value::String(surface.kind.clone()))]);
103 shape.extend(
104 surface
105 .details
106 .iter()
107 .map(|(key, value)| (key.clone(), value.clone())),
108 );
109 shape
110}
111
112pub(super) type TypeParts<'a> = (
113 &'a str,
114 &'a str,
115 BTreeMap<String, Value>,
116 BTreeMap<String, BTreeMap<String, Value>>,
117);
118
119#[derive(Debug, Clone, PartialEq)]
120pub(super) struct OperationSurface {
121 pub(super) source: crate::rest_hir::HttpOperationSource,
122 pub(super) parameter_sources: crate::rest_hir::project_params::sources::ParameterSources,
123 pub(super) descriptor: BTreeMap<String, Value>,
124 pub(super) params: BTreeMap<String, BTreeMap<String, Value>>,
125}