marc_rs/
format.rs

1use std::fmt::Display;
2
3/// MARC format types
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5pub enum MarcFormat {
6    /// MARC21 bibliographic format
7    Marc21,
8    /// UNIMARC bibliographic format
9    Unimarc,
10    /// MARC XML format
11    MarcXml,
12}
13
14impl From<&str> for MarcFormat {
15    fn from(s: &str) -> Self {
16        match s.to_lowercase().as_str() {
17            "marc21" | "marc" => MarcFormat::Marc21,
18            "unimarc" => MarcFormat::Unimarc,
19            "xml" => MarcFormat::MarcXml,
20            _ => MarcFormat::Marc21,
21        }
22    }
23}
24
25impl Display for MarcFormat {
26    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
27        match self {
28            MarcFormat::Marc21 => write!(f, "marc21"),
29            MarcFormat::Unimarc => write!(f, "unimarc"),
30            MarcFormat::MarcXml => write!(f, "xml"),
31        }
32    }
33}
34
35/// Character encodings supported by MARC formats
36#[derive(Debug, Clone, Copy, PartialEq, Eq)]
37pub enum Encoding {
38    /// UTF-8 encoding
39    Utf8,
40    /// MARC-8 encoding (MARC21's default)
41    Marc8,
42    /// ISO 8859-1 (Latin-1)
43    Iso8859_1,
44    /// ISO 8859-2 (Latin-2)
45    Iso8859_2,
46    /// ISO 8859-5 (Cyrillic)
47    Iso8859_5,
48    /// ISO 8859-7 (Greek)
49    Iso8859_7,
50    /// ISO 8859-15 (Latin-9)
51    Iso8859_15,
52    /// ISO 5426 (Extension of the Latin alphabet for bibliographic information interchange)
53    Iso5426,
54}
55
56impl From<&str> for Encoding {
57    fn from(s: &str) -> Self {
58        match s.to_lowercase().as_str() {
59            "utf8" | "utf-8" => Encoding::Utf8,
60            "marc8" | "marc-8" => Encoding::Marc8,
61            "iso8859-1" | "latin1" | "latin-1" => Encoding::Iso8859_1,
62            "iso8859-2" | "latin2" | "latin-2" => Encoding::Iso8859_2,
63            "iso8859-5" => Encoding::Iso8859_5,
64            "iso8859-7" => Encoding::Iso8859_7,
65            "iso8859-15" | "latin9" | "latin-9" => Encoding::Iso8859_15,
66            "iso5426" | "iso-5426" => Encoding::Iso5426,
67            _ => Encoding::Utf8,
68        }
69    }
70}
71
72impl Display for Encoding {
73    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
74        match self {
75            Encoding::Utf8 => write!(f, "utf8"),
76            Encoding::Marc8 => write!(f, "marc8"),
77            Encoding::Iso8859_1 => write!(f, "iso8859-1"),
78            Encoding::Iso8859_2 => write!(f, "iso8859-2"),
79            Encoding::Iso8859_5 => write!(f, "iso8859-5"),
80            Encoding::Iso8859_7 => write!(f, "iso8859-7"),
81            Encoding::Iso8859_15 => write!(f, "iso8859-15"),
82            Encoding::Iso5426 => write!(f, "iso5426"),
83        }
84    }
85}
86
87/// Combination of format and encoding
88#[derive(Debug, Clone, Copy)]
89pub struct FormatEncoding {
90    pub format: MarcFormat,
91    pub encoding: Encoding,
92}
93
94impl FormatEncoding {
95    /// Create a new FormatEncoding
96    pub fn new(format: MarcFormat, encoding: Encoding) -> Self {
97        Self { format, encoding }
98    }
99
100    /// Default MARC21 with MARC-8 encoding
101    pub fn marc21_default() -> Self {
102        Self {
103            format: MarcFormat::Marc21,
104            encoding: Encoding::Marc8,
105        }
106    }
107
108    /// Default UNIMARC with UTF-8 encoding
109    pub fn unimarc_default() -> Self {
110        Self {
111            format: MarcFormat::Unimarc,
112            encoding: Encoding::Utf8,
113        }
114    }
115
116    /// MARC XML with UTF-8 encoding
117    pub fn marc_xml() -> Self {
118        Self {
119            format: MarcFormat::MarcXml,
120            encoding: Encoding::Utf8,
121        }
122    }
123}
124
125