Skip to main content

wp_data_fmt/
lib.rs

1mod csv;
2pub mod fmt_meta;
3mod formatter;
4mod json;
5mod kv;
6mod proto;
7mod raw;
8mod sql;
9
10pub use csv::Csv;
11#[allow(deprecated)]
12pub use formatter::{DataFormat, RecordFormatter, StaticDataFormatter, ValueFormatter};
13pub use json::Json;
14pub use kv::KeyValue;
15pub use proto::ProtoTxt;
16pub use raw::Raw;
17pub use sql::SqlInsert;
18
19use wp_model_core::model::fmt_def::TextFmt;
20
21pub enum FormatType {
22    Json(Json),
23    Csv(Csv),
24    Kv(KeyValue),
25    Sql(SqlInsert),
26    Raw(Raw),
27    ProtoText(ProtoTxt),
28}
29
30impl From<&TextFmt> for FormatType {
31    fn from(fmt: &TextFmt) -> Self {
32        match fmt {
33            TextFmt::Json => FormatType::Json(Json),
34            TextFmt::Csv => FormatType::Csv(Csv::default()),
35            TextFmt::Kv => FormatType::Kv(KeyValue::default()),
36            TextFmt::Raw => FormatType::Raw(Raw),
37            TextFmt::ProtoText => FormatType::ProtoText(ProtoTxt),
38            TextFmt::Show => FormatType::Raw(Raw),
39            TextFmt::Proto => FormatType::ProtoText(ProtoTxt),
40        }
41    }
42}
43
44pub enum SqlFormat {
45    Json(Json),
46    Kv(KeyValue),
47    Raw(Raw),
48    ProtoText(ProtoTxt),
49}
50
51impl From<&TextFmt> for SqlFormat {
52    fn from(fmt: &TextFmt) -> Self {
53        match fmt {
54            TextFmt::Json => SqlFormat::Json(Json),
55            TextFmt::Kv => SqlFormat::Kv(KeyValue::default()),
56            TextFmt::Raw => SqlFormat::Raw(Raw),
57            TextFmt::ProtoText => SqlFormat::ProtoText(ProtoTxt),
58            _ => SqlFormat::Raw(Raw),
59        }
60    }
61}
62
63#[cfg(test)]
64#[allow(deprecated)]
65mod tests {
66    use super::*;
67    use wp_model_core::model::{DataField, DataRecord, FieldStorage};
68
69    #[test]
70    fn test_format_type_from_text_fmt_json() {
71        let fmt = FormatType::from(&TextFmt::Json);
72        matches!(fmt, FormatType::Json(_));
73    }
74
75    #[test]
76    fn test_format_type_from_text_fmt_csv() {
77        let fmt = FormatType::from(&TextFmt::Csv);
78        matches!(fmt, FormatType::Csv(_));
79    }
80
81    #[test]
82    fn test_format_type_from_text_fmt_kv() {
83        let fmt = FormatType::from(&TextFmt::Kv);
84        matches!(fmt, FormatType::Kv(_));
85    }
86
87    #[test]
88    fn test_format_type_from_text_fmt_raw() {
89        let fmt = FormatType::from(&TextFmt::Raw);
90        matches!(fmt, FormatType::Raw(_));
91    }
92
93    #[test]
94    fn test_format_type_from_text_fmt_proto_text() {
95        let fmt = FormatType::from(&TextFmt::ProtoText);
96        matches!(fmt, FormatType::ProtoText(_));
97    }
98
99    #[test]
100    fn test_format_type_from_text_fmt_show() {
101        let fmt = FormatType::from(&TextFmt::Show);
102        matches!(fmt, FormatType::Raw(_));
103    }
104
105    #[test]
106    fn test_format_type_from_text_fmt_proto() {
107        let fmt = FormatType::from(&TextFmt::Proto);
108        matches!(fmt, FormatType::ProtoText(_));
109    }
110
111    #[test]
112    fn test_sql_format_from_text_fmt_json() {
113        let fmt = SqlFormat::from(&TextFmt::Json);
114        matches!(fmt, SqlFormat::Json(_));
115    }
116
117    #[test]
118    fn test_sql_format_from_text_fmt_kv() {
119        let fmt = SqlFormat::from(&TextFmt::Kv);
120        matches!(fmt, SqlFormat::Kv(_));
121    }
122
123    #[test]
124    fn test_sql_format_from_text_fmt_raw() {
125        let fmt = SqlFormat::from(&TextFmt::Raw);
126        matches!(fmt, SqlFormat::Raw(_));
127    }
128
129    #[test]
130    fn test_sql_format_from_text_fmt_proto_text() {
131        let fmt = SqlFormat::from(&TextFmt::ProtoText);
132        matches!(fmt, SqlFormat::ProtoText(_));
133    }
134
135    #[test]
136    fn test_sql_format_from_text_fmt_csv_fallback() {
137        // Csv is not supported in SqlFormat, should fallback to Raw
138        let fmt = SqlFormat::from(&TextFmt::Csv);
139        matches!(fmt, SqlFormat::Raw(_));
140    }
141
142    #[test]
143    fn test_format_type_dataformat_null() {
144        use wp_model_core::model::Value;
145        let fmt = FormatType::from(&TextFmt::Json);
146        assert_eq!(fmt.format_value(&Value::Null), "null");
147
148        let fmt = FormatType::from(&TextFmt::Csv);
149        assert_eq!(fmt.format_value(&Value::Null), "");
150
151        let fmt = FormatType::from(&TextFmt::Raw);
152        assert_eq!(fmt.format_value(&Value::Null), "");
153    }
154
155    #[test]
156    fn test_format_type_dataformat_bool() {
157        use wp_model_core::model::Value;
158        let fmt = FormatType::from(&TextFmt::Json);
159        assert_eq!(fmt.format_value(&Value::Bool(true)), "true");
160        assert_eq!(fmt.format_value(&Value::Bool(false)), "false");
161    }
162
163    #[test]
164    fn test_format_type_dataformat_string() {
165        use wp_model_core::model::Value;
166        let json_fmt = FormatType::from(&TextFmt::Json);
167        assert_eq!(
168            json_fmt.format_value(&Value::Chars("hello".into())),
169            "\"hello\""
170        );
171
172        let raw_fmt = FormatType::from(&TextFmt::Raw);
173        assert_eq!(raw_fmt.format_value(&Value::Chars("hello".into())), "hello");
174    }
175
176    #[test]
177    fn test_format_type_dataformat_i64() {
178        use wp_model_core::model::Value;
179        let fmt = FormatType::from(&TextFmt::Json);
180        assert_eq!(fmt.format_value(&Value::Digit(42)), "42");
181        assert_eq!(fmt.format_value(&Value::Digit(-100)), "-100");
182    }
183
184    #[test]
185    fn test_format_type_dataformat_f64() {
186        use wp_model_core::model::Value;
187        let fmt = FormatType::from(&TextFmt::Json);
188        assert_eq!(fmt.format_value(&Value::Float(3.24)), "3.24");
189    }
190
191    #[test]
192    fn test_format_type_format_record() {
193        let json_fmt = FormatType::from(&TextFmt::Json);
194        let record = DataRecord {
195            id: Default::default(),
196            items: vec![
197                FieldStorage::Owned(DataField::from_chars("name", "Alice")),
198                FieldStorage::Owned(DataField::from_digit("age", 30)),
199            ],
200        };
201        let result = json_fmt.fmt_record(&record);
202        assert!(result.starts_with('{'));
203        assert!(result.ends_with('}'));
204        assert!(result.contains("\"name\":\"Alice\""));
205    }
206
207    #[test]
208    fn test_format_type_format_field() {
209        let fmt = FormatType::from(&TextFmt::Json);
210        let field = FieldStorage::Owned(DataField::from_chars("key", "value"));
211        let result = fmt.fmt_field(&field);
212        assert!(result.contains("key"));
213        assert!(result.contains("value"));
214    }
215
216    #[test]
217    fn test_csv_format_type() {
218        let csv_fmt = FormatType::from(&TextFmt::Csv);
219        let record = DataRecord {
220            id: Default::default(),
221            items: vec![
222                FieldStorage::Owned(DataField::from_chars("a", "x")),
223                FieldStorage::Owned(DataField::from_chars("b", "y")),
224            ],
225        };
226        let result = csv_fmt.fmt_record(&record);
227        assert_eq!(result, "x,y");
228    }
229
230    #[test]
231    fn test_kv_format_type() {
232        let kv_fmt = FormatType::from(&TextFmt::Kv);
233        let record = DataRecord {
234            id: Default::default(),
235            items: vec![FieldStorage::Owned(DataField::from_chars("name", "Alice"))],
236        };
237        let result = kv_fmt.fmt_record(&record);
238        assert!(result.contains("name"));
239        assert!(result.contains("Alice"));
240    }
241}