use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::BTreeMap;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct VersionMap {
pub format: u32,
pub contract: String,
pub versions: Vec<MapVersion>,
pub steps: Vec<MapStep>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct MapVersion {
pub id: String,
pub value: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct MapStep {
pub from: String,
pub to: String,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub types: BTreeMap<String, TypeChange>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub operations: BTreeMap<String, Change>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct TypeChange {
pub change: ChangeKind,
#[serde(skip_serializing_if = "Option::is_none")]
pub kind: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub details: Option<BTreeMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub from: Option<BTreeMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub to: Option<BTreeMap<String, Value>>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub members: BTreeMap<String, Change>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Change {
pub change: ChangeKind,
#[serde(skip_serializing_if = "Option::is_none")]
pub from: Option<BTreeMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub to: Option<BTreeMap<String, Value>>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum ChangeKind {
Added,
Removed,
Changed,
}
#[derive(Debug, Clone, PartialEq)]
pub(super) struct TypeSurface {
pub(super) kind: String,
pub(super) details: BTreeMap<String, Value>,
pub(super) members: BTreeMap<String, BTreeMap<String, Value>>,
}
pub(super) fn type_shape(surface: &TypeSurface) -> BTreeMap<String, Value> {
let mut shape = BTreeMap::from([("kind".to_string(), Value::String(surface.kind.clone()))]);
shape.extend(
surface
.details
.iter()
.map(|(key, value)| (key.clone(), value.clone())),
);
shape
}
pub(super) type TypeParts<'a> = (
&'a str,
&'a str,
BTreeMap<String, Value>,
BTreeMap<String, BTreeMap<String, Value>>,
);
#[derive(Debug, Clone, PartialEq)]
pub(super) struct OperationSurface {
pub(super) source: crate::rest_hir::HttpOperationSource,
pub(super) parameter_sources: crate::rest_hir::project_params::sources::ParameterSources,
pub(super) descriptor: BTreeMap<String, Value>,
pub(super) params: BTreeMap<String, BTreeMap<String, Value>>,
}