use serde::{Deserialize, Serialize};
use crate::domain::{FactStatus, GraphVersion};
use super::{
BusinessAlias, BusinessSemantics, BusinessTechnicalMappingDefinition, BusinessTermStatus,
OntologyIdentity, TechnicalTargetKind,
};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BusinessKnowledgeSource {
pub source_id: String,
pub source_path: String,
pub authority_rank: usize,
pub content_digest: String,
pub glossary: super::BusinessGlossary,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BusinessKnowledgeProjectionInput {
pub repository_id: String,
pub source_scope: String,
pub resolved_commit_sha: String,
pub sources: Vec<BusinessKnowledgeSource>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BusinessEvidence {
pub evidence_id: String,
pub source_id: String,
pub source_path: String,
pub source_digest: String,
pub resolved_commit_sha: String,
pub line_start: u32,
pub line_end: u32,
pub confidence_basis_points: u16,
pub lifecycle: FactStatus,
pub valid_from_graph_version: GraphVersion,
#[serde(skip_serializing_if = "Option::is_none")]
pub valid_until_graph_version: Option<GraphVersion>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BusinessDefinitionFact {
pub definition: String,
pub preferred: bool,
pub evidence: BusinessEvidence,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BusinessKnowledgeConflict {
pub predicate: String,
pub competing_values: Vec<String>,
pub evidence_ids: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BusinessDomain {
pub identity: OntologyIdentity,
pub entity_id: String,
pub id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub evidence: BusinessEvidence,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BusinessTechnicalMapping {
#[serde(flatten)]
pub definition: BusinessTechnicalMappingDefinition,
pub resolution_state: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub resolved_id: Option<String>,
pub target_hint: String,
pub evidence: BusinessEvidence,
}
impl BusinessTechnicalMapping {
pub fn is_resolved(&self) -> bool {
self.resolution_state == "resolved" && self.resolved_id.is_some()
}
pub fn query_seed(&self) -> &str {
self.resolved_id
.as_deref()
.unwrap_or(self.target_hint.as_str())
}
pub fn target_kind(&self) -> TechnicalTargetKind {
self.definition.target_kind
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BusinessTerm {
pub identity: OntologyIdentity,
pub entity_id: String,
pub id: String,
pub domain_id: String,
pub canonical_name: String,
pub language: String,
pub status: BusinessTermStatus,
pub definitions: Vec<BusinessDefinitionFact>,
pub aliases: Vec<BusinessAlias>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub semantics: Vec<BusinessSemantics>,
pub conflicts: Vec<BusinessKnowledgeConflict>,
pub mappings: Vec<BusinessTechnicalMapping>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BusinessKnowledgeStatus {
pub repository_id: String,
pub source_scope: String,
pub resolved_commit_sha: String,
pub projected_graph_version: GraphVersion,
pub stale: bool,
pub source_count: usize,
pub domain_count: usize,
pub term_count: usize,
pub mapping_count: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_error: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BusinessKnowledgeProjection {
pub status: BusinessKnowledgeStatus,
pub resolution: super::BusinessKnowledgeResolution,
pub domains: Vec<BusinessDomain>,
pub terms: Vec<BusinessTerm>,
}