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 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::from_owned(DataField::from_chars("name", "Alice")),
198 FieldStorage::from_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::from_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::from_owned(DataField::from_chars("a", "x")),
223 FieldStorage::from_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::from_owned(DataField::from_chars(
236 "name", "Alice",
237 ))],
238 };
239 let result = kv_fmt.fmt_record(&record);
240 assert!(result.contains("name"));
241 assert!(result.contains("Alice"));
242 }
243}