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 sql;
29
30#[derive(Debug, serde::Serialize, serde::Deserialize)]
36#[must_use = "import results should be processed or errors checked"]
37pub struct ImportResult {
38 pub tables: Vec<TableData>,
40 pub tables_requiring_name: Vec<TableRequiringName>,
42 pub errors: Vec<ImportError>,
44 pub ai_suggestions: Option<Vec<serde_json::Value>>,
46}
47
48#[derive(Debug, thiserror::Error, serde::Serialize, serde::Deserialize)]
50pub enum ImportError {
51 #[error("Parse error: {0}")]
52 ParseError(String),
53 #[error("Validation error: {0}")]
54 ValidationError(String),
55 #[error("IO error: {0}")]
56 IoError(String),
57 #[error("BPMN validation error: {0}")]
58 BPMNValidationError(String),
59 #[error("DMN validation error: {0}")]
60 DMNValidationError(String),
61 #[error("OpenAPI validation error: {0}")]
62 OpenAPIValidationError(String),
63 #[error("BPMN parse error: {0}")]
64 BPMNParseError(String),
65 #[error("DMN parse error: {0}")]
66 DMNParseError(String),
67 #[error("OpenAPI parse error: {0}")]
68 OpenAPIParseError(String),
69}
70
71#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
73#[serde(rename_all = "camelCase")]
74pub struct TableData {
75 pub table_index: usize,
77
78 #[serde(skip_serializing_if = "Option::is_none")]
81 pub id: Option<String>,
82 pub name: Option<String>,
84 #[serde(skip_serializing_if = "Option::is_none")]
86 pub api_version: Option<String>,
87 #[serde(skip_serializing_if = "Option::is_none")]
89 pub version: Option<String>,
90 #[serde(skip_serializing_if = "Option::is_none")]
92 pub status: Option<String>,
93 #[serde(skip_serializing_if = "Option::is_none")]
95 pub kind: Option<String>,
96
97 #[serde(skip_serializing_if = "Option::is_none")]
100 pub domain: Option<String>,
101 #[serde(skip_serializing_if = "Option::is_none")]
103 pub data_product: Option<String>,
104 #[serde(skip_serializing_if = "Option::is_none")]
106 pub tenant: Option<String>,
107
108 #[serde(skip_serializing_if = "Option::is_none")]
111 pub description: Option<serde_json::Value>,
112
113 #[serde(skip_serializing_if = "Option::is_none")]
116 pub physical_name: Option<String>,
117 #[serde(skip_serializing_if = "Option::is_none")]
119 pub physical_type: Option<String>,
120 #[serde(skip_serializing_if = "Option::is_none")]
122 pub business_name: Option<String>,
123 #[serde(skip_serializing_if = "Option::is_none")]
125 pub data_granularity_description: Option<String>,
126
127 pub columns: Vec<ColumnData>,
130
131 #[serde(default, skip_serializing_if = "Vec::is_empty")]
134 pub servers: Vec<serde_json::Value>,
135
136 #[serde(skip_serializing_if = "Option::is_none")]
139 pub team: Option<serde_json::Value>,
140 #[serde(skip_serializing_if = "Option::is_none")]
142 pub support: Option<serde_json::Value>,
143
144 #[serde(default, skip_serializing_if = "Vec::is_empty")]
147 pub roles: Vec<serde_json::Value>,
148
149 #[serde(default, skip_serializing_if = "Vec::is_empty")]
152 pub sla_properties: Vec<serde_json::Value>,
153 #[serde(default, skip_serializing_if = "Vec::is_empty")]
155 pub quality: Vec<std::collections::HashMap<String, serde_json::Value>>,
156
157 #[serde(skip_serializing_if = "Option::is_none")]
160 pub price: Option<serde_json::Value>,
161
162 #[serde(default, skip_serializing_if = "Vec::is_empty")]
165 pub tags: Vec<String>,
166 #[serde(default, skip_serializing_if = "Vec::is_empty")]
168 pub custom_properties: Vec<serde_json::Value>,
169 #[serde(default, skip_serializing_if = "Vec::is_empty")]
171 pub authoritative_definitions: Vec<serde_json::Value>,
172
173 #[serde(skip_serializing_if = "Option::is_none")]
176 pub contract_created_ts: Option<String>,
177
178 #[serde(default, skip_serializing_if = "std::collections::HashMap::is_empty")]
181 pub odcs_metadata: std::collections::HashMap<String, serde_json::Value>,
182}
183
184#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
186#[serde(rename_all = "camelCase")]
187pub struct ColumnData {
188 #[serde(skip_serializing_if = "Option::is_none")]
191 pub id: Option<String>,
192 pub name: String,
194 #[serde(skip_serializing_if = "Option::is_none")]
196 pub business_name: Option<String>,
197 #[serde(skip_serializing_if = "Option::is_none")]
199 pub description: Option<String>,
200
201 #[serde(rename = "dataType")]
204 pub data_type: String,
205 #[serde(skip_serializing_if = "Option::is_none")]
207 pub physical_type: Option<String>,
208 #[serde(skip_serializing_if = "Option::is_none")]
210 pub physical_name: Option<String>,
211 #[serde(skip_serializing_if = "Option::is_none")]
213 pub logical_type_options: Option<crate::models::LogicalTypeOptions>,
214
215 #[serde(default)]
218 pub primary_key: bool,
219 #[serde(skip_serializing_if = "Option::is_none")]
221 pub primary_key_position: Option<i32>,
222 #[serde(default)]
224 pub unique: bool,
225 #[serde(default = "default_true")]
227 pub nullable: bool,
228
229 #[serde(default)]
232 pub partitioned: bool,
233 #[serde(skip_serializing_if = "Option::is_none")]
235 pub partition_key_position: Option<i32>,
236 #[serde(default)]
238 pub clustered: bool,
239
240 #[serde(skip_serializing_if = "Option::is_none")]
243 pub classification: Option<String>,
244 #[serde(default)]
246 pub critical_data_element: bool,
247 #[serde(skip_serializing_if = "Option::is_none")]
249 pub encrypted_name: Option<String>,
250
251 #[serde(default, skip_serializing_if = "Vec::is_empty")]
254 pub transform_source_objects: Vec<String>,
255 #[serde(skip_serializing_if = "Option::is_none")]
257 pub transform_logic: Option<String>,
258 #[serde(skip_serializing_if = "Option::is_none")]
260 pub transform_description: Option<String>,
261
262 #[serde(default, skip_serializing_if = "Vec::is_empty")]
265 pub examples: Vec<serde_json::Value>,
266 #[serde(skip_serializing_if = "Option::is_none")]
268 pub default_value: Option<serde_json::Value>,
269
270 #[serde(default, skip_serializing_if = "Vec::is_empty")]
273 pub relationships: Vec<crate::models::PropertyRelationship>,
274 #[serde(default, skip_serializing_if = "Vec::is_empty")]
276 pub authoritative_definitions: Vec<crate::models::AuthoritativeDefinition>,
277
278 #[serde(skip_serializing_if = "Option::is_none")]
281 pub quality: Option<Vec<std::collections::HashMap<String, serde_json::Value>>>,
282 #[serde(skip_serializing_if = "Option::is_none")]
284 pub enum_values: Option<Vec<String>>,
285
286 #[serde(default, skip_serializing_if = "Vec::is_empty")]
289 pub tags: Vec<String>,
290 #[serde(default, skip_serializing_if = "std::collections::HashMap::is_empty")]
292 pub custom_properties: std::collections::HashMap<String, serde_json::Value>,
293}
294
295fn default_true() -> bool {
296 true
297}
298
299impl Default for ColumnData {
300 fn default() -> Self {
301 Self {
302 id: None,
304 name: String::new(),
305 business_name: None,
306 description: None,
307 data_type: String::new(),
309 physical_type: None,
310 physical_name: None,
311 logical_type_options: None,
312 primary_key: false,
314 primary_key_position: None,
315 unique: false,
316 nullable: true,
317 partitioned: false,
319 partition_key_position: None,
320 clustered: false,
321 classification: None,
323 critical_data_element: false,
324 encrypted_name: None,
325 transform_source_objects: Vec::new(),
327 transform_logic: None,
328 transform_description: None,
329 examples: Vec::new(),
331 default_value: None,
332 relationships: Vec::new(),
334 authoritative_definitions: Vec::new(),
335 quality: None,
337 enum_values: None,
338 tags: Vec::new(),
340 custom_properties: std::collections::HashMap::new(),
341 }
342 }
343}
344
345pub use avro::AvroImporter;
347pub use cads::CADSImporter;
348pub use decision::DecisionImporter;
349pub use json_schema::JSONSchemaImporter;
350pub use knowledge::KnowledgeImporter;
351pub use odcl::ODCLImporter;
352pub use odcs::ODCSImporter;
353pub use odcs_shared::ParserError;
354pub use odps::ODPSImporter;
355pub use protobuf::ProtobufImporter;
356pub use sql::SQLImporter;
357
358#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
360pub struct TableRequiringName {
361 pub table_index: usize,
362 pub suggested_name: Option<String>,
363}