use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(transparent)]
pub struct StableId(pub String);
pub type Tags = Vec<String>;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct CustomProperty {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id: Option<StableId>,
pub property: String,
pub value: Value,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
pub type CustomProperties = Vec<CustomProperty>;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct AuthoritativeDefinition {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id: Option<StableId>,
pub url: String,
#[serde(rename = "type")]
pub definition_type: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
pub type AuthoritativeDefinitions = Vec<AuthoritativeDefinition>;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct ContractDescription {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub usage: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub purpose: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub limitations: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub authoritative_definitions: Option<AuthoritativeDefinitions>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub custom_properties: Option<CustomProperties>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct SchemaElement {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id: Option<StableId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub physical_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub business_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub authoritative_definitions: Option<AuthoritativeDefinitions>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tags: Option<Tags>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub custom_properties: Option<CustomProperties>,
}