use serde::{Deserialize, Serialize};
use super::common::{Cardinality, CodeDefinition};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MigSchema {
pub message_type: String,
pub variant: Option<String>,
pub version: String,
pub publication_date: String,
pub author: String,
pub format_version: String,
pub source_file: String,
pub segments: Vec<MigSegment>,
pub segment_groups: Vec<MigSegmentGroup>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MigSegment {
pub id: String,
pub name: String,
pub description: Option<String>,
pub counter: Option<String>,
pub level: i32,
pub number: Option<String>,
pub max_rep_std: i32,
pub max_rep_spec: i32,
pub status_std: Option<String>,
pub status_spec: Option<String>,
pub example: Option<String>,
pub data_elements: Vec<MigDataElement>,
pub composites: Vec<MigComposite>,
}
impl MigSegment {
pub fn cardinality(&self) -> Cardinality {
let status = self
.status_spec
.as_deref()
.or(self.status_std.as_deref())
.unwrap_or("C");
Cardinality::from_status(status)
}
pub fn max_rep(&self) -> i32 {
self.max_rep_spec.max(self.max_rep_std)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MigSegmentGroup {
pub id: String,
pub name: String,
pub description: Option<String>,
pub counter: Option<String>,
pub level: i32,
pub max_rep_std: i32,
pub max_rep_spec: i32,
pub status_std: Option<String>,
pub status_spec: Option<String>,
pub segments: Vec<MigSegment>,
pub nested_groups: Vec<MigSegmentGroup>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub variant_code: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub variant_qualifier_position: Option<(usize, usize)>,
#[serde(default)]
pub variant_codes: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub merged_variant_count: Option<u32>,
}
impl MigSegmentGroup {
pub fn cardinality(&self) -> Cardinality {
let status = self
.status_spec
.as_deref()
.or(self.status_std.as_deref())
.unwrap_or("C");
Cardinality::from_status(status)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MigComposite {
pub id: String,
pub name: String,
pub description: Option<String>,
pub status_std: Option<String>,
pub status_spec: Option<String>,
pub data_elements: Vec<MigDataElement>,
pub position: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MigDataElement {
pub id: String,
pub name: String,
pub description: Option<String>,
pub status_std: Option<String>,
pub status_spec: Option<String>,
pub format_std: Option<String>,
pub format_spec: Option<String>,
pub codes: Vec<CodeDefinition>,
pub position: usize,
}