canon_protocol/
specification.rs1use serde::{Deserialize, Serialize};
2use serde_yaml::Value;
3use std::collections::HashMap;
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct CanonSpecification {
12 pub canon: String,
14
15 pub r#type: String,
21
22 pub metadata: SpecificationMetadata,
24
25 #[serde(skip_serializing_if = "Option::is_none")]
27 pub includes: Option<Vec<String>>,
28
29 #[serde(skip_serializing_if = "Option::is_none")]
31 pub schema: Option<HashMap<String, SchemaField>>,
32
33 #[serde(flatten)]
35 pub content: HashMap<String, Value>,
36}
37
38#[derive(Debug, Clone, Serialize, Deserialize)]
40pub struct SpecificationMetadata {
41 pub id: String,
43
44 pub version: String,
46
47 pub publisher: String,
49
50 #[serde(skip_serializing_if = "Option::is_none")]
52 pub title: Option<String>,
53
54 #[serde(skip_serializing_if = "Option::is_none")]
56 pub description: Option<String>,
57}
58
59#[derive(Debug, Clone, Serialize, Deserialize)]
61pub struct SchemaField {
62 pub r#type: FieldType,
64
65 #[serde(skip_serializing_if = "Option::is_none")]
67 pub required: Option<bool>,
68
69 #[serde(skip_serializing_if = "Option::is_none")]
71 pub uri: Option<String>,
72
73 #[serde(skip_serializing_if = "Option::is_none")]
75 pub pattern: Option<String>,
76
77 #[serde(skip_serializing_if = "Option::is_none")]
79 pub r#enum: Option<Vec<Value>>,
80
81 #[serde(skip_serializing_if = "Option::is_none")]
83 pub properties: Option<HashMap<String, SchemaField>>,
84
85 #[serde(skip_serializing_if = "Option::is_none")]
87 pub items: Option<Box<SchemaField>>,
88
89 #[serde(skip_serializing_if = "Option::is_none")]
91 pub title: Option<String>,
92
93 #[serde(skip_serializing_if = "Option::is_none")]
95 pub description: Option<String>,
96
97 #[serde(skip_serializing_if = "Option::is_none")]
100 pub minimum: Option<f64>,
101
102 #[serde(skip_serializing_if = "Option::is_none")]
104 pub maximum: Option<f64>,
105
106 #[serde(skip_serializing_if = "Option::is_none")]
108 pub exclusive_minimum: Option<f64>,
109
110 #[serde(skip_serializing_if = "Option::is_none")]
112 pub exclusive_maximum: Option<f64>,
113
114 #[serde(skip_serializing_if = "Option::is_none")]
116 pub multiple_of: Option<f64>,
117
118 #[serde(skip_serializing_if = "Option::is_none")]
121 pub min_length: Option<usize>,
122
123 #[serde(skip_serializing_if = "Option::is_none")]
125 pub max_length: Option<usize>,
126
127 #[serde(skip_serializing_if = "Option::is_none")]
129 pub format: Option<StringFormat>,
130
131 #[serde(skip_serializing_if = "Option::is_none")]
134 pub min_items: Option<usize>,
135
136 #[serde(skip_serializing_if = "Option::is_none")]
138 pub max_items: Option<usize>,
139
140 #[serde(skip_serializing_if = "Option::is_none")]
142 pub unique_items: Option<bool>,
143
144 #[serde(skip_serializing_if = "Option::is_none")]
147 pub additional_properties: Option<bool>,
148
149 #[serde(skip_serializing_if = "Option::is_none")]
152 pub default: Option<Value>,
153
154 #[serde(skip_serializing_if = "Option::is_none")]
156 pub examples: Option<Vec<Value>>,
157
158 #[serde(skip_serializing_if = "Option::is_none")]
161 pub r#const: Option<Value>,
162
163 #[serde(skip_serializing_if = "Option::is_none")]
165 pub deprecated: Option<bool>,
166}
167
168#[derive(Debug, Clone, Serialize, Deserialize)]
170#[serde(rename_all = "lowercase")]
171pub enum FieldType {
172 String,
173 Number,
174 Boolean,
175 Object,
176 Array,
177 Ref,
178 Any,
179}
180
181#[derive(Debug, Clone, Serialize, Deserialize)]
183#[serde(rename_all = "lowercase")]
184pub enum StringFormat {
185 Email,
186 Uri,
187 Uuid,
188 Date,
189 #[serde(rename = "datetime")]
190 DateTime,
191 Time,
192 #[serde(rename = "ipv4")]
193 Ipv4,
194 #[serde(rename = "ipv6")]
195 Ipv6,
196 Hostname,
197 Regex,
198}
199
200#[derive(Debug, Serialize, Deserialize)]
202pub struct OutputConfiguration {
203 pub artifacts: Option<Vec<String>>,
204 pub directory: Option<String>,
205}
206
207#[derive(Debug, Serialize, Deserialize)]
208pub struct SourceDefinition {
209 pub path: String,
210 pub r#type: String,
211 pub include: Option<Vec<String>>,
212 pub exclude: Option<Vec<String>>,
213}