data_modelling_core/models/
mod.rs

1//! Models module for the SDK
2//!
3//! Defines core data structures used by the SDK for import/export operations.
4//! These models are simplified versions focused on the SDK's needs.
5
6#[cfg(feature = "bpmn")]
7pub mod bpmn;
8pub mod cads;
9pub mod column;
10pub mod cross_domain;
11pub mod data_model;
12pub mod decision;
13#[cfg(feature = "dmn")]
14pub mod dmn;
15pub mod domain;
16pub mod domain_config;
17pub mod enums;
18pub mod knowledge;
19pub mod odps;
20#[cfg(feature = "openapi")]
21pub mod openapi;
22pub mod relationship;
23pub mod table;
24pub mod tag;
25pub mod workspace;
26
27#[cfg(feature = "bpmn")]
28pub use bpmn::{BPMNModel, BPMNModelFormat};
29pub use cads::{
30    CADSAsset, CADSBPMNFormat, CADSBPMNModel, CADSCompliance, CADSComplianceControl,
31    CADSComplianceFramework, CADSComplianceStatus, CADSDMNFormat, CADSDMNModel, CADSDescription,
32    CADSExternalLink, CADSImpactArea, CADSKind, CADSMitigationStatus, CADSOpenAPIFormat,
33    CADSOpenAPISpec, CADSPricing, CADSPricingModel, CADSRisk, CADSRiskAssessment,
34    CADSRiskClassification, CADSRiskMitigation, CADSRuntime, CADSRuntimeContainer,
35    CADSRuntimeResources, CADSSLA, CADSSLAProperty, CADSStatus, CADSTeamMember,
36    CADSValidationProfile, CADSValidationProfileAppliesTo,
37};
38pub use column::{
39    AuthoritativeDefinition, Column, ForeignKey, LogicalTypeOptions, PropertyRelationship,
40};
41pub use cross_domain::{CrossDomainConfig, CrossDomainRelationshipRef, CrossDomainTableRef};
42pub use data_model::DataModel;
43#[cfg(feature = "dmn")]
44pub use dmn::{DMNModel, DMNModelFormat};
45pub use domain::{
46    CADSNode, CrowsfeetCardinality, Domain, NodeConnection, ODCSNode, SharedNodeReference, System,
47    SystemConnection,
48};
49pub use domain_config::{DomainConfig, DomainOwner, ViewPosition};
50pub use enums::*;
51pub use odps::{
52    ODPSApiVersion, ODPSAuthoritativeDefinition, ODPSCustomProperty, ODPSDataProduct,
53    ODPSDescription, ODPSInputContract, ODPSInputPort, ODPSManagementPort, ODPSOutputPort,
54    ODPSSBOM, ODPSStatus, ODPSSupport, ODPSTeam, ODPSTeamMember,
55};
56#[cfg(feature = "openapi")]
57pub use openapi::{OpenAPIFormat, OpenAPIModel};
58pub use relationship::{
59    ConnectionHandle, ConnectionPoint, ETLJobMetadata, ForeignKeyDetails, Relationship,
60    VisualMetadata,
61};
62pub use table::{ContactDetails, Position, SlaProperty, Table};
63pub use tag::Tag;
64pub use workspace::{DomainReference, Workspace};
65
66// Decision and Knowledge models
67pub use decision::{
68    AssetLink, AssetRelationship, ComplianceAssessment, Decision, DecisionCategory, DecisionDriver,
69    DecisionIndex, DecisionIndexEntry, DecisionOption, DecisionStatus, DriverPriority,
70};
71pub use knowledge::{
72    ArticleRelationship, KnowledgeArticle, KnowledgeIndex, KnowledgeIndexEntry, KnowledgeStatus,
73    KnowledgeType, RelatedArticle, ReviewFrequency, SkillLevel,
74};
75
76use serde::{Deserialize, Serialize};
77
78/// Model type for references
79#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
80#[serde(rename_all = "PascalCase")]
81pub enum ModelType {
82    /// BPMN model
83    Bpmn,
84    /// DMN model
85    Dmn,
86    /// OpenAPI specification
87    OpenApi,
88}
89
90/// Model reference for CADS assets
91///
92/// Represents a reference from a CADS asset to a BPMN, DMN, or OpenAPI model.
93#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
94pub struct ModelReference {
95    /// Type of model being referenced
96    pub model_type: ModelType,
97    /// Target domain ID (None for same domain)
98    #[serde(skip_serializing_if = "Option::is_none")]
99    pub domain_id: Option<uuid::Uuid>,
100    /// Name of the referenced model
101    pub model_name: String,
102    /// Optional description of the reference
103    #[serde(skip_serializing_if = "Option::is_none")]
104    pub description: Option<String>,
105}
106
107impl ModelReference {
108    /// Create a new model reference
109    pub fn new(model_type: ModelType, model_name: String) -> Self {
110        ModelReference {
111            model_type,
112            domain_id: None,
113            model_name,
114            description: None,
115        }
116    }
117
118    /// Create a cross-domain model reference
119    pub fn new_cross_domain(
120        model_type: ModelType,
121        domain_id: uuid::Uuid,
122        model_name: String,
123    ) -> Self {
124        ModelReference {
125            model_type,
126            domain_id: Some(domain_id),
127            model_name,
128            description: None,
129        }
130    }
131}