wp_data_fmt/
raw.rs

1use crate::formatter::DataFormat;
2use wp_model_core::model::types::value::ObjectValue;
3use wp_model_core::model::{DataField, DataRecord, DataType, Value};
4
5#[derive(Debug, Default)]
6pub struct Raw;
7
8impl Raw {
9    pub fn new() -> Self {
10        Self
11    }
12}
13
14impl DataFormat for Raw {
15    type Output = String;
16    fn format_null(&self) -> String {
17        String::new()
18    }
19    fn format_bool(&self, v: &bool) -> String {
20        v.to_string()
21    }
22    fn format_string(&self, v: &str) -> String {
23        v.to_string()
24    }
25    fn format_i64(&self, v: &i64) -> String {
26        v.to_string()
27    }
28    fn format_f64(&self, v: &f64) -> String {
29        v.to_string()
30    }
31    fn format_ip(&self, v: &std::net::IpAddr) -> String {
32        v.to_string()
33    }
34    fn format_datetime(&self, v: &chrono::NaiveDateTime) -> String {
35        v.to_string()
36    }
37    fn format_object(&self, value: &ObjectValue) -> String {
38        if value.is_empty() {
39            return "{}".to_string();
40        }
41        let segments: Vec<String> = value
42            .iter()
43            .map(|(k, v)| format!("{}={}", k, self.fmt_value(v.get_value())))
44            .collect();
45        format!("{{{}}}", segments.join(", "))
46    }
47    fn format_array(&self, value: &[DataField]) -> String {
48        if value.is_empty() {
49            return "[]".to_string();
50        }
51        let content: Vec<String> = value
52            .iter()
53            .map(|field| self.fmt_value(field.get_value()))
54            .collect();
55        format!("[{}]", content.join(", "))
56    }
57    fn format_field(&self, field: &DataField) -> String {
58        match field.get_value() {
59            Value::Chars(s) => s.to_string(),
60            _ => self.fmt_value(field.get_value()),
61        }
62    }
63    fn format_record(&self, record: &DataRecord) -> String {
64        record
65            .items
66            .iter()
67            .filter(|f| *f.get_meta() != DataType::Ignore)
68            .map(|f| self.format_field(f))
69            .collect::<Vec<_>>()
70            .join(" ")
71    }
72}
73
74#[cfg(test)]
75mod tests {
76    use super::*;
77    use std::net::IpAddr;
78    use std::str::FromStr;
79
80    #[test]
81    fn test_raw_new() {
82        let raw = Raw::new();
83        assert_eq!(raw.format_null(), "");
84    }
85
86    #[test]
87    fn test_raw_default() {
88        let raw = Raw;
89        assert_eq!(raw.format_null(), "");
90    }
91
92    #[test]
93    fn test_format_null() {
94        let raw = Raw;
95        assert_eq!(raw.format_null(), "");
96    }
97
98    #[test]
99    fn test_format_bool() {
100        let raw = Raw;
101        assert_eq!(raw.format_bool(&true), "true");
102        assert_eq!(raw.format_bool(&false), "false");
103    }
104
105    #[test]
106    fn test_format_string() {
107        let raw = Raw;
108        assert_eq!(raw.format_string("hello"), "hello");
109        assert_eq!(raw.format_string("world"), "world");
110        assert_eq!(raw.format_string(""), "");
111    }
112
113    #[test]
114    fn test_format_i64() {
115        let raw = Raw;
116        assert_eq!(raw.format_i64(&0), "0");
117        assert_eq!(raw.format_i64(&42), "42");
118        assert_eq!(raw.format_i64(&-100), "-100");
119        assert_eq!(raw.format_i64(&i64::MAX), i64::MAX.to_string());
120    }
121
122    #[test]
123    fn test_format_f64() {
124        let raw = Raw;
125        assert_eq!(raw.format_f64(&3.24), "3.24");
126        assert_eq!(raw.format_f64(&0.0), "0");
127        assert_eq!(raw.format_f64(&-2.5), "-2.5");
128    }
129
130    #[test]
131    fn test_format_ip() {
132        let raw = Raw;
133        let ipv4 = IpAddr::from_str("192.168.1.1").unwrap();
134        assert_eq!(raw.format_ip(&ipv4), "192.168.1.1");
135
136        let ipv6 = IpAddr::from_str("::1").unwrap();
137        assert_eq!(raw.format_ip(&ipv6), "::1");
138    }
139
140    #[test]
141    fn test_format_datetime() {
142        let raw = Raw;
143        let dt = chrono::NaiveDateTime::parse_from_str("2024-01-15 10:30:45", "%Y-%m-%d %H:%M:%S")
144            .unwrap();
145        let result = raw.format_datetime(&dt);
146        assert!(result.contains("2024"));
147        assert!(result.contains("01"));
148        assert!(result.contains("15"));
149    }
150
151    #[test]
152    fn test_format_field_chars() {
153        let raw = Raw;
154        let field = DataField::from_chars("name", "Alice");
155        let result = raw.format_field(&field);
156        assert_eq!(result, "Alice");
157    }
158
159    #[test]
160    fn test_format_field_digit() {
161        let raw = Raw;
162        let field = DataField::from_digit("age", 30);
163        let result = raw.format_field(&field);
164        assert_eq!(result, "30");
165    }
166
167    #[test]
168    fn test_format_record() {
169        let raw = Raw;
170        let record = DataRecord {
171            items: vec![
172                DataField::from_chars("name", "Alice"),
173                DataField::from_digit("age", 30),
174            ],
175        };
176        let result = raw.format_record(&record);
177        assert_eq!(result, "Alice 30");
178    }
179
180    #[test]
181    fn test_format_array_empty() {
182        let raw = Raw;
183        let arr: Vec<DataField> = vec![];
184        assert_eq!(raw.format_array(&arr), "[]");
185    }
186
187    #[test]
188    fn test_format_array_with_values() {
189        let raw = Raw;
190        let arr = vec![
191            DataField::from_digit("", 1),
192            DataField::from_digit("", 2),
193            DataField::from_digit("", 3),
194        ];
195        let result = raw.format_array(&arr);
196        assert_eq!(result, "[1, 2, 3]");
197    }
198
199    #[test]
200    fn test_format_object_empty() {
201        let raw = Raw;
202        let obj = ObjectValue::new();
203        assert_eq!(raw.format_object(&obj), "{}");
204    }
205}