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}