mig_types/schema/
common.rs1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
5pub enum Cardinality {
6 Mandatory,
8 Required,
10 Dependent,
12 Optional,
14 NotUsed,
16 Conditional,
18}
19
20impl Cardinality {
21 pub fn from_status(status: &str) -> Self {
23 match status.trim() {
24 "M" => Cardinality::Mandatory,
25 "R" => Cardinality::Required,
26 "D" => Cardinality::Dependent,
27 "O" => Cardinality::Optional,
28 "N" => Cardinality::NotUsed,
29 "C" => Cardinality::Conditional,
30 _ => Cardinality::Conditional, }
32 }
33
34 pub fn is_required(&self) -> bool {
36 matches!(self, Cardinality::Mandatory | Cardinality::Required)
37 }
38}
39
40#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
42pub struct CodeDefinition {
43 pub value: String,
45 pub name: String,
47 pub description: Option<String>,
49}
50
51#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
53pub enum EdifactDataType {
54 Alphabetic,
55 Numeric,
56 Alphanumeric,
57}
58
59#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
61pub struct EdifactFormat {
62 pub data_type: EdifactDataType,
63 pub min_length: Option<usize>,
65 pub max_length: usize,
67}
68
69impl EdifactFormat {
70 pub fn parse(format: &str) -> Option<Self> {
72 let format = format.trim();
73 if format.is_empty() {
74 return None;
75 }
76
77 let (type_str, rest) = if let Some(rest) = format.strip_prefix("an") {
79 ("an", rest)
80 } else if let Some(rest) = format.strip_prefix('a') {
81 ("a", rest)
82 } else {
83 let rest = format.strip_prefix('n')?;
84 ("n", rest)
85 };
86
87 let data_type = match type_str {
88 "a" => EdifactDataType::Alphabetic,
89 "n" => EdifactDataType::Numeric,
90 "an" => EdifactDataType::Alphanumeric,
91 _ => return None,
92 };
93
94 let (is_variable, length_str) = if let Some(stripped) = rest.strip_prefix("..") {
95 (true, stripped)
96 } else {
97 (false, rest)
98 };
99
100 let max_length: usize = length_str.parse().ok()?;
101 let min_length = if is_variable { None } else { Some(max_length) };
102
103 Some(EdifactFormat {
104 data_type,
105 min_length,
106 max_length,
107 })
108 }
109}