data_modelling_core/import/
mod.rs1pub mod avro;
13#[cfg(feature = "bpmn")]
14pub mod bpmn;
15pub mod cads;
16pub mod dbmv;
17pub mod decision;
18#[cfg(feature = "dmn")]
19pub mod dmn;
20pub mod json_schema;
21pub mod knowledge;
22pub mod odcl;
23pub mod odcs;
24pub mod odcs_shared;
25pub mod odps;
26#[cfg(feature = "openapi")]
27pub mod openapi;
28pub mod protobuf;
29pub mod sketch;
30pub mod sql;
31
32#[derive(Debug, serde::Serialize, serde::Deserialize)]
38#[must_use = "import results should be processed or errors checked"]
39pub struct ImportResult {
40 pub tables: Vec<TableData>,
42 pub tables_requiring_name: Vec<TableRequiringName>,
44 pub errors: Vec<ImportError>,
46 pub ai_suggestions: Option<Vec<serde_json::Value>>,
48}
49
50#[derive(Debug, thiserror::Error, serde::Serialize, serde::Deserialize)]
52pub enum ImportError {
53 #[error("Parse error: {0}")]
54 ParseError(String),
55 #[error("Validation error: {0}")]
56 ValidationError(String),
57 #[error("IO error: {0}")]
58 IoError(String),
59 #[error("BPMN validation error: {0}")]
60 BPMNValidationError(String),
61 #[error("DMN validation error: {0}")]
62 DMNValidationError(String),
63 #[error("OpenAPI validation error: {0}")]
64 OpenAPIValidationError(String),
65 #[error("BPMN parse error: {0}")]
66 BPMNParseError(String),
67 #[error("DMN parse error: {0}")]
68 DMNParseError(String),
69 #[error("OpenAPI parse error: {0}")]
70 OpenAPIParseError(String),
71}
72
73#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
75#[serde(rename_all = "camelCase")]
76pub struct TableData {
77 pub table_index: usize,
79
80 #[serde(skip_serializing_if = "Option::is_none")]
83 pub id: Option<String>,
84 pub name: Option<String>,
86 #[serde(skip_serializing_if = "Option::is_none")]
88 pub api_version: Option<String>,
89 #[serde(skip_serializing_if = "Option::is_none")]
91 pub version: Option<String>,
92 #[serde(skip_serializing_if = "Option::is_none")]
94 pub status: Option<String>,
95 #[serde(skip_serializing_if = "Option::is_none")]
97 pub kind: Option<String>,
98
99 #[serde(skip_serializing_if = "Option::is_none")]
102 pub domain: Option<String>,
103 #[serde(skip_serializing_if = "Option::is_none")]
105 pub data_product: Option<String>,
106 #[serde(skip_serializing_if = "Option::is_none")]
108 pub tenant: Option<String>,
109
110 #[serde(skip_serializing_if = "Option::is_none")]
113 pub description: Option<serde_json::Value>,
114
115 #[serde(skip_serializing_if = "Option::is_none")]
118 pub physical_name: Option<String>,
119 #[serde(skip_serializing_if = "Option::is_none")]
121 pub physical_type: Option<String>,
122 #[serde(skip_serializing_if = "Option::is_none")]
124 pub business_name: Option<String>,
125 #[serde(skip_serializing_if = "Option::is_none")]
127 pub data_granularity_description: Option<String>,
128
129 pub columns: Vec<ColumnData>,
132
133 #[serde(default, skip_serializing_if = "Vec::is_empty")]
136 pub servers: Vec<serde_json::Value>,
137
138 #[serde(skip_serializing_if = "Option::is_none")]
141 pub team: Option<serde_json::Value>,
142 #[serde(skip_serializing_if = "Option::is_none")]
144 pub support: Option<serde_json::Value>,
145
146 #[serde(default, skip_serializing_if = "Vec::is_empty")]
149 pub roles: Vec<serde_json::Value>,
150
151 #[serde(default, skip_serializing_if = "Vec::is_empty")]
154 pub sla_properties: Vec<serde_json::Value>,
155 #[serde(default, skip_serializing_if = "Vec::is_empty")]
157 pub quality: Vec<std::collections::HashMap<String, serde_json::Value>>,
158
159 #[serde(skip_serializing_if = "Option::is_none")]
162 pub price: Option<serde_json::Value>,
163
164 #[serde(default, skip_serializing_if = "Vec::is_empty")]
167 pub tags: Vec<String>,
168 #[serde(default, skip_serializing_if = "Vec::is_empty")]
170 pub custom_properties: Vec<serde_json::Value>,
171 #[serde(default, skip_serializing_if = "Vec::is_empty")]
173 pub authoritative_definitions: Vec<serde_json::Value>,
174
175 #[serde(skip_serializing_if = "Option::is_none")]
178 pub contract_created_ts: Option<String>,
179
180 #[serde(default, skip_serializing_if = "std::collections::HashMap::is_empty")]
183 pub odcs_metadata: std::collections::HashMap<String, serde_json::Value>,
184}
185
186#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
188#[serde(rename_all = "camelCase")]
189pub struct ColumnData {
190 #[serde(skip_serializing_if = "Option::is_none")]
193 pub id: Option<String>,
194 pub name: String,
196 #[serde(skip_serializing_if = "Option::is_none")]
198 pub business_name: Option<String>,
199 #[serde(skip_serializing_if = "Option::is_none")]
201 pub description: Option<String>,
202
203 #[serde(rename = "dataType")]
206 pub data_type: String,
207 #[serde(skip_serializing_if = "Option::is_none")]
209 pub physical_type: Option<String>,
210 #[serde(skip_serializing_if = "Option::is_none")]
212 pub physical_name: Option<String>,
213 #[serde(skip_serializing_if = "Option::is_none")]
215 pub logical_type_options: Option<crate::models::LogicalTypeOptions>,
216
217 #[serde(default)]
220 pub primary_key: bool,
221 #[serde(skip_serializing_if = "Option::is_none")]
223 pub primary_key_position: Option<i32>,
224 #[serde(default)]
226 pub unique: bool,
227 #[serde(default = "default_true")]
229 pub nullable: bool,
230
231 #[serde(default)]
234 pub partitioned: bool,
235 #[serde(skip_serializing_if = "Option::is_none")]
237 pub partition_key_position: Option<i32>,
238 #[serde(default)]
240 pub clustered: bool,
241
242 #[serde(skip_serializing_if = "Option::is_none")]
245 pub classification: Option<String>,
246 #[serde(default)]
248 pub critical_data_element: bool,
249 #[serde(skip_serializing_if = "Option::is_none")]
251 pub encrypted_name: Option<String>,
252
253 #[serde(default, skip_serializing_if = "Vec::is_empty")]
256 pub transform_source_objects: Vec<String>,
257 #[serde(skip_serializing_if = "Option::is_none")]
259 pub transform_logic: Option<String>,
260 #[serde(skip_serializing_if = "Option::is_none")]
262 pub transform_description: Option<String>,
263
264 #[serde(default, skip_serializing_if = "Vec::is_empty")]
267 pub examples: Vec<serde_json::Value>,
268 #[serde(skip_serializing_if = "Option::is_none")]
270 pub default_value: Option<serde_json::Value>,
271
272 #[serde(default, skip_serializing_if = "Vec::is_empty")]
275 pub relationships: Vec<crate::models::PropertyRelationship>,
276 #[serde(default, skip_serializing_if = "Vec::is_empty")]
278 pub authoritative_definitions: Vec<crate::models::AuthoritativeDefinition>,
279
280 #[serde(skip_serializing_if = "Option::is_none")]
283 pub quality: Option<Vec<std::collections::HashMap<String, serde_json::Value>>>,
284 #[serde(skip_serializing_if = "Option::is_none")]
286 pub enum_values: Option<Vec<String>>,
287
288 #[serde(default, skip_serializing_if = "Vec::is_empty")]
291 pub tags: Vec<String>,
292 #[serde(default, skip_serializing_if = "std::collections::HashMap::is_empty")]
294 pub custom_properties: std::collections::HashMap<String, serde_json::Value>,
295}
296
297fn default_true() -> bool {
298 true
299}
300
301impl Default for ColumnData {
302 fn default() -> Self {
303 Self {
304 id: None,
306 name: String::new(),
307 business_name: None,
308 description: None,
309 data_type: String::new(),
311 physical_type: None,
312 physical_name: None,
313 logical_type_options: None,
314 primary_key: false,
316 primary_key_position: None,
317 unique: false,
318 nullable: true,
319 partitioned: false,
321 partition_key_position: None,
322 clustered: false,
323 classification: None,
325 critical_data_element: false,
326 encrypted_name: None,
327 transform_source_objects: Vec::new(),
329 transform_logic: None,
330 transform_description: None,
331 examples: Vec::new(),
333 default_value: None,
334 relationships: Vec::new(),
336 authoritative_definitions: Vec::new(),
337 quality: None,
339 enum_values: None,
340 tags: Vec::new(),
342 custom_properties: std::collections::HashMap::new(),
343 }
344 }
345}
346
347pub use avro::AvroImporter;
349pub use cads::CADSImporter;
350pub use dbmv::DBMVImporter;
351pub use decision::DecisionImporter;
352pub use json_schema::JSONSchemaImporter;
353pub use knowledge::KnowledgeImporter;
354pub use odcl::ODCLImporter;
355pub use odcs::ODCSImporter;
356pub use odcs_shared::ParserError;
357pub use odps::ODPSImporter;
358pub use protobuf::ProtobufImporter;
359pub use sketch::SketchImporter;
360pub use sql::SQLImporter;
361
362#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
364pub struct TableRequiringName {
365 pub table_index: usize,
366 pub suggested_name: Option<String>,
367}