data_modelling_core/import/
mod.rs1pub mod avro;
13#[cfg(feature = "bpmn")]
14pub mod bpmn;
15pub mod cads;
16pub mod decision;
17#[cfg(feature = "dmn")]
18pub mod dmn;
19pub mod json_schema;
20pub mod knowledge;
21pub mod odcl;
22pub mod odcs;
23pub mod odcs_shared;
24pub mod odps;
25#[cfg(feature = "openapi")]
26pub mod openapi;
27pub mod protobuf;
28pub mod sketch;
29pub mod sql;
30
31#[derive(Debug, serde::Serialize, serde::Deserialize)]
37#[must_use = "import results should be processed or errors checked"]
38pub struct ImportResult {
39 pub tables: Vec<TableData>,
41 pub tables_requiring_name: Vec<TableRequiringName>,
43 pub errors: Vec<ImportError>,
45 pub ai_suggestions: Option<Vec<serde_json::Value>>,
47}
48
49#[derive(Debug, thiserror::Error, serde::Serialize, serde::Deserialize)]
51pub enum ImportError {
52 #[error("Parse error: {0}")]
53 ParseError(String),
54 #[error("Validation error: {0}")]
55 ValidationError(String),
56 #[error("IO error: {0}")]
57 IoError(String),
58 #[error("BPMN validation error: {0}")]
59 BPMNValidationError(String),
60 #[error("DMN validation error: {0}")]
61 DMNValidationError(String),
62 #[error("OpenAPI validation error: {0}")]
63 OpenAPIValidationError(String),
64 #[error("BPMN parse error: {0}")]
65 BPMNParseError(String),
66 #[error("DMN parse error: {0}")]
67 DMNParseError(String),
68 #[error("OpenAPI parse error: {0}")]
69 OpenAPIParseError(String),
70}
71
72#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
74#[serde(rename_all = "camelCase")]
75pub struct TableData {
76 pub table_index: usize,
78
79 #[serde(skip_serializing_if = "Option::is_none")]
82 pub id: Option<String>,
83 pub name: Option<String>,
85 #[serde(skip_serializing_if = "Option::is_none")]
87 pub api_version: Option<String>,
88 #[serde(skip_serializing_if = "Option::is_none")]
90 pub version: Option<String>,
91 #[serde(skip_serializing_if = "Option::is_none")]
93 pub status: Option<String>,
94 #[serde(skip_serializing_if = "Option::is_none")]
96 pub kind: Option<String>,
97
98 #[serde(skip_serializing_if = "Option::is_none")]
101 pub domain: Option<String>,
102 #[serde(skip_serializing_if = "Option::is_none")]
104 pub data_product: Option<String>,
105 #[serde(skip_serializing_if = "Option::is_none")]
107 pub tenant: Option<String>,
108
109 #[serde(skip_serializing_if = "Option::is_none")]
112 pub description: Option<serde_json::Value>,
113
114 #[serde(skip_serializing_if = "Option::is_none")]
117 pub physical_name: Option<String>,
118 #[serde(skip_serializing_if = "Option::is_none")]
120 pub physical_type: Option<String>,
121 #[serde(skip_serializing_if = "Option::is_none")]
123 pub business_name: Option<String>,
124 #[serde(skip_serializing_if = "Option::is_none")]
126 pub data_granularity_description: Option<String>,
127
128 pub columns: Vec<ColumnData>,
131
132 #[serde(default, skip_serializing_if = "Vec::is_empty")]
135 pub servers: Vec<serde_json::Value>,
136
137 #[serde(skip_serializing_if = "Option::is_none")]
140 pub team: Option<serde_json::Value>,
141 #[serde(skip_serializing_if = "Option::is_none")]
143 pub support: Option<serde_json::Value>,
144
145 #[serde(default, skip_serializing_if = "Vec::is_empty")]
148 pub roles: Vec<serde_json::Value>,
149
150 #[serde(default, skip_serializing_if = "Vec::is_empty")]
153 pub sla_properties: Vec<serde_json::Value>,
154 #[serde(default, skip_serializing_if = "Vec::is_empty")]
156 pub quality: Vec<std::collections::HashMap<String, serde_json::Value>>,
157
158 #[serde(skip_serializing_if = "Option::is_none")]
161 pub price: Option<serde_json::Value>,
162
163 #[serde(default, skip_serializing_if = "Vec::is_empty")]
166 pub tags: Vec<String>,
167 #[serde(default, skip_serializing_if = "Vec::is_empty")]
169 pub custom_properties: Vec<serde_json::Value>,
170 #[serde(default, skip_serializing_if = "Vec::is_empty")]
172 pub authoritative_definitions: Vec<serde_json::Value>,
173
174 #[serde(skip_serializing_if = "Option::is_none")]
177 pub contract_created_ts: Option<String>,
178
179 #[serde(default, skip_serializing_if = "std::collections::HashMap::is_empty")]
182 pub odcs_metadata: std::collections::HashMap<String, serde_json::Value>,
183}
184
185#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
187#[serde(rename_all = "camelCase")]
188pub struct ColumnData {
189 #[serde(skip_serializing_if = "Option::is_none")]
192 pub id: Option<String>,
193 pub name: String,
195 #[serde(skip_serializing_if = "Option::is_none")]
197 pub business_name: Option<String>,
198 #[serde(skip_serializing_if = "Option::is_none")]
200 pub description: Option<String>,
201
202 #[serde(rename = "dataType")]
205 pub data_type: String,
206 #[serde(skip_serializing_if = "Option::is_none")]
208 pub physical_type: Option<String>,
209 #[serde(skip_serializing_if = "Option::is_none")]
211 pub physical_name: Option<String>,
212 #[serde(skip_serializing_if = "Option::is_none")]
214 pub logical_type_options: Option<crate::models::LogicalTypeOptions>,
215
216 #[serde(default)]
219 pub primary_key: bool,
220 #[serde(skip_serializing_if = "Option::is_none")]
222 pub primary_key_position: Option<i32>,
223 #[serde(default)]
225 pub unique: bool,
226 #[serde(default = "default_true")]
228 pub nullable: bool,
229
230 #[serde(default)]
233 pub partitioned: bool,
234 #[serde(skip_serializing_if = "Option::is_none")]
236 pub partition_key_position: Option<i32>,
237 #[serde(default)]
239 pub clustered: bool,
240
241 #[serde(skip_serializing_if = "Option::is_none")]
244 pub classification: Option<String>,
245 #[serde(default)]
247 pub critical_data_element: bool,
248 #[serde(skip_serializing_if = "Option::is_none")]
250 pub encrypted_name: Option<String>,
251
252 #[serde(default, skip_serializing_if = "Vec::is_empty")]
255 pub transform_source_objects: Vec<String>,
256 #[serde(skip_serializing_if = "Option::is_none")]
258 pub transform_logic: Option<String>,
259 #[serde(skip_serializing_if = "Option::is_none")]
261 pub transform_description: Option<String>,
262
263 #[serde(default, skip_serializing_if = "Vec::is_empty")]
266 pub examples: Vec<serde_json::Value>,
267 #[serde(skip_serializing_if = "Option::is_none")]
269 pub default_value: Option<serde_json::Value>,
270
271 #[serde(default, skip_serializing_if = "Vec::is_empty")]
274 pub relationships: Vec<crate::models::PropertyRelationship>,
275 #[serde(default, skip_serializing_if = "Vec::is_empty")]
277 pub authoritative_definitions: Vec<crate::models::AuthoritativeDefinition>,
278
279 #[serde(skip_serializing_if = "Option::is_none")]
282 pub quality: Option<Vec<std::collections::HashMap<String, serde_json::Value>>>,
283 #[serde(skip_serializing_if = "Option::is_none")]
285 pub enum_values: Option<Vec<String>>,
286
287 #[serde(default, skip_serializing_if = "Vec::is_empty")]
290 pub tags: Vec<String>,
291 #[serde(default, skip_serializing_if = "std::collections::HashMap::is_empty")]
293 pub custom_properties: std::collections::HashMap<String, serde_json::Value>,
294}
295
296fn default_true() -> bool {
297 true
298}
299
300impl Default for ColumnData {
301 fn default() -> Self {
302 Self {
303 id: None,
305 name: String::new(),
306 business_name: None,
307 description: None,
308 data_type: String::new(),
310 physical_type: None,
311 physical_name: None,
312 logical_type_options: None,
313 primary_key: false,
315 primary_key_position: None,
316 unique: false,
317 nullable: true,
318 partitioned: false,
320 partition_key_position: None,
321 clustered: false,
322 classification: None,
324 critical_data_element: false,
325 encrypted_name: None,
326 transform_source_objects: Vec::new(),
328 transform_logic: None,
329 transform_description: None,
330 examples: Vec::new(),
332 default_value: None,
333 relationships: Vec::new(),
335 authoritative_definitions: Vec::new(),
336 quality: None,
338 enum_values: None,
339 tags: Vec::new(),
341 custom_properties: std::collections::HashMap::new(),
342 }
343 }
344}
345
346pub use avro::AvroImporter;
348pub use cads::CADSImporter;
349pub use decision::DecisionImporter;
350pub use json_schema::JSONSchemaImporter;
351pub use knowledge::KnowledgeImporter;
352pub use odcl::ODCLImporter;
353pub use odcs::ODCSImporter;
354pub use odcs_shared::ParserError;
355pub use odps::ODPSImporter;
356pub use protobuf::ProtobufImporter;
357pub use sketch::SketchImporter;
358pub use sql::SQLImporter;
359
360#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
362pub struct TableRequiringName {
363 pub table_index: usize,
364 pub suggested_name: Option<String>,
365}