br_fields/
lib.rs

1use json::JsonValue;
2use log::info;
3
4/// 日期时间
5pub mod datetime;
6/// 字典
7pub mod dict;
8/// 附件
9pub mod files;
10pub mod float;
11pub mod int;
12/// 坐标
13pub mod location;
14pub mod select;
15pub mod str;
16/// 关联表字段
17pub mod table;
18pub mod text;
19
20pub trait Field {
21    fn require(&mut self, _require: bool) -> &mut Self {
22        self
23    }
24    fn sql(&mut self, model: &str) -> String;
25    /// 隐藏字段
26    fn hide(&mut self) -> &mut Self;
27    /// 字段描述
28    fn describe(&mut self, text: &str) -> &mut Self;
29    fn field(&mut self) -> JsonValue;
30    /// 验证方法
31    fn verify(&mut self, data: JsonValue) -> JsonValue {
32        data
33    }
34    /// api格式
35    fn swagger(&mut self) -> JsonValue;
36    /// 示例
37    fn example(&mut self, data: JsonValue) -> &mut Self;
38}
39
40#[derive(Debug, Clone)]
41pub enum FieldMode {
42    Key,
43    Pass,
44    Color,
45    String,
46    Tel,
47    Ident,
48    Code,
49    Email,
50    Table,
51    Text,
52    Editor,
53    Url,
54    Files,
55    Json,
56    Array,
57    Object,
58    Float,
59    Int,
60    Switch,
61    Datetime,
62    Year,
63    Date,
64    Time,
65    Timestamp,
66    Select,
67    Radio,
68    Location,
69    Dict,
70    BarCode,
71    QrCode,
72    Tree,
73    Polygon,
74}
75
76impl FieldMode {
77    pub fn from(name: &str) -> FieldMode {
78        match name {
79            "key" => FieldMode::Key,
80            "pass" => FieldMode::Pass,
81            "string" => FieldMode::String,
82            "color" => FieldMode::Color,
83            "tel" => FieldMode::Tel,
84            "ident" => FieldMode::Ident,
85            "email" => FieldMode::Email,
86            "table" => FieldMode::Table,
87            "text" => FieldMode::Text,
88            "editor" => FieldMode::Editor,
89            "url" => FieldMode::Url,
90            "file" => FieldMode::Files,
91            "json" => FieldMode::Json,
92            "array" => FieldMode::Array,
93            "object" => FieldMode::Object,
94            "float" => FieldMode::Float,
95            "int" => FieldMode::Int,
96            "switch" => FieldMode::Switch,
97            "datetime" => FieldMode::Datetime,
98            "year" => FieldMode::Year,
99            "date" => FieldMode::Date,
100            "time" => FieldMode::Time,
101            "timestamp" => FieldMode::Timestamp,
102            "select" => FieldMode::Select,
103            "radio" => FieldMode::Radio,
104            "location" => FieldMode::Location,
105            "polygon" => FieldMode::Polygon,
106            "dict" => FieldMode::Dict,
107            "code" => FieldMode::Code,
108            "barcode" => FieldMode::BarCode,
109            "qrcode" => FieldMode::QrCode,
110            "tree" => FieldMode::Tree,
111            _ => {
112                info!("未知字段类型 mode: {name}");
113                FieldMode::String
114            }
115        }
116    }
117}
118
119/// 解析数据
120pub fn field(model: &str, field: &str, data: JsonValue) -> String {
121    let mode = data["mode"].as_str().unwrap();
122    let require = data["require"].as_bool().unwrap_or(false);
123    let title = data["title"].as_str().unwrap_or("未知标题");
124
125    let field_mode = FieldMode::from(mode);
126
127    let row = match field_mode {
128        FieldMode::Table => {
129            let table = data["table"].as_str().unwrap();
130            let fields: Vec<&str> = data["fields"].members().map(|x| x.as_str().unwrap()).collect();
131            let api = data["api"].as_str().unwrap();
132            let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
133            table::Table::new(require, field, title, table, fields, api).multiple(multiple_count).sql(model)
134        }
135        FieldMode::Tree => {
136            let table = data["table"].as_str().unwrap();
137            let pid_field = data["pid_field"].as_str().unwrap();
138            let fields: Vec<&str> = data["fields"].members().map(|x| x.as_str().unwrap()).collect();
139            let api = data["api"].as_str().unwrap();
140            let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
141            table::Tree::new(require, field, title, table, pid_field, fields, api).multiple(multiple_count).sql(model)
142        }
143        FieldMode::Text => {
144            let default = data["def"].as_str().unwrap_or("");
145            let length = data["length"].as_i32().unwrap_or(0);
146            text::Text::new(require, field, title, default).length(length).sql(model)
147        }
148        FieldMode::Editor => {
149            let default = data["def"].as_str().unwrap_or("");
150            let length = data["length"].as_i32().unwrap_or(0);
151            text::Editor::new(require, field, title, default).length(length).sql(model)
152        }
153        FieldMode::Json => {
154            let default = data["def"].clone();
155            let length = data["length"].as_i32().unwrap_or(0);
156            text::Json::new(require, field, title, default).length(length).sql(model)
157        }
158        FieldMode::Array => {
159            let default = data["def"].clone();
160            let length = data["length"].as_i32().unwrap_or(0);
161            text::Array::new(require, field, title, default).length(length).sql(model)
162        }
163        FieldMode::Object => {
164            let default = data["def"].clone();
165            let length = data["length"].as_i32().unwrap_or(0);
166            text::Object::new(require, field, title, default).length(length).sql(model)
167        }
168        FieldMode::Url => {
169            let default = data["def"].as_str().unwrap_or("");
170            text::Url::new(require, field, title, default).sql(model)
171        }
172        FieldMode::Files => {
173            let length = data["length"].as_i32().unwrap_or(1);
174            let encrypt = data["encrypt"].as_bool().unwrap_or(false);
175            let size = data["size"].as_usize().unwrap_or(0);
176            let default = data["def"].as_str().unwrap_or("");
177            let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
178            let mut files_mode = files::Files::new(require, field, title);
179
180            if length > 1 {
181                files_mode.multiple(length);
182            }
183            if encrypt {
184                files_mode.encrypt();
185            }
186            files_mode.def(default);
187            files_mode.size(size);
188            files_mode.option(option);
189            files_mode.sql(model)
190        }
191        FieldMode::Float => {
192            let length = data["length"].as_i32().unwrap();
193            let dec = data["dec"].as_usize().unwrap();
194            let default = data["def"].to_string().parse::<f64>().unwrap_or(0.0);
195            float::Float::new(require, field, title, length, dec, default).sql(model)
196        }
197        FieldMode::Int => {
198            let length = data["length"].as_i32().unwrap();
199            let default = data["def"].as_i64().unwrap();
200            int::Int::new(require, field, title, length, default).sql(model)
201        }
202        FieldMode::Switch => {
203            let default = data["def"].to_string().parse::<bool>().unwrap();
204            int::Switch::new(require, field, title, default).sql(model)
205        }
206        FieldMode::Datetime => {
207            let default = data["def"].as_str().unwrap_or("");
208            datetime::Datetime::new(require, field, title, default).sql(model)
209        }
210        FieldMode::Year => {
211            let default = data["def"].as_str().unwrap_or("");
212            datetime::Year::new(require, field, title, default).sql(model)
213        }
214        FieldMode::Date => {
215            let default = data["def"].as_str().unwrap();
216            datetime::Date::new(require, field, title, default).sql(model)
217        }
218        FieldMode::Time => {
219            let default = data["def"].as_str().unwrap();
220            datetime::Time::new(require, field, title, default).sql(model)
221        }
222        FieldMode::Timestamp => {
223            let dec = data["dec"].as_i32().unwrap();
224            let default = data["def"].as_f64().unwrap_or(0.0);
225            datetime::Timestamp::new(require, field, title, dec, default).sql(model)
226        }
227        FieldMode::Select => {
228            let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
229
230            let def: Vec<&str> = data["def"].members().map(|x| x.as_str().unwrap()).collect();
231
232            select::Select::new(require, field, title, option, def).table_name(data["table_name"].as_str().unwrap_or("")).sql(model)
233        }
234        FieldMode::Radio => {
235            let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
236            select::Radio::new(require, field, title, option, data["def"].as_str().unwrap()).table_name(data["table_name"].as_str().unwrap_or("")).sql(model)
237        }
238        FieldMode::Location => {
239            let default = data["def"].as_str().unwrap_or("");
240            location::Location::new(require, field, title).def(default).sql(model)
241        }
242        FieldMode::Dict => {
243            let table = data["table"].as_str().unwrap();
244            let fields = data["fields"].as_str().unwrap_or("");
245            let api = data["api"].as_str().unwrap();
246            let default = data["def"].as_str().unwrap_or("");
247
248            let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
249            dict::Dict::new(require, field, title, table, fields, api).multiple(multiple_count).default(default).sql(model)
250        }
251
252        FieldMode::Key | FieldMode::Pass | FieldMode::String | FieldMode::Code | FieldMode::BarCode | FieldMode::Email | FieldMode::Tel | FieldMode::Ident | FieldMode::Color | FieldMode::QrCode => {
253            let default = data["def"].as_str().unwrap_or("");
254            let dec = data["dec"].as_str().unwrap_or("");
255            let length = data["length"].as_usize().unwrap_or(20);
256            match FieldMode::from(mode) {
257                FieldMode::Code => {
258                    str::Code::new(require, field, title, length, dec, default).sql(model)
259                }
260                FieldMode::BarCode => str::BarCode::new(require, field, title, default).sql(model),
261                FieldMode::Email => str::Email::new(require, field, title, default).sql(model),
262                FieldMode::Tel => str::Tel::new(require, field, title, default).sql(model),
263                FieldMode::Ident => str::Ident::new(require, field, title, default).sql(model),
264                FieldMode::Color => str::Color::new(require, field, title, default).sql(model),
265                FieldMode::String => {
266                    str::Str::new(require, field, title, length, default).sql(model)
267                }
268                FieldMode::Pass => {
269                    str::Pass::new(require, field, title, length, default).sql(model)
270                }
271                FieldMode::Key => str::Key::new(true, field, title, length).auto(data["auto"].as_bool().unwrap()).sql(model),
272                FieldMode::QrCode => {
273                    str::QrCode::new(require, field, title, length, default).sql(model)
274                }
275                _ => str::Str::new(require, field, title, length, default).sql(model),
276            }
277        }
278        FieldMode::Polygon => {
279            let default = data["def"].clone();
280            let length = data["length"].as_i32().unwrap_or(0);
281            text::Array::new(require, field, title, default).length(length).sql(model)
282        }
283    };
284    row.to_string()
285}
286
287/// 验证
288pub fn verify(field: &str, data: JsonValue) -> JsonValue {
289    let mode = data["mode"].as_str().unwrap();
290    let require = data["require"].as_bool().unwrap_or(false);
291    let title = data["title"].as_str().unwrap_or("未知标题");
292    let field_mode = FieldMode::from(mode);
293
294    match field_mode {
295        FieldMode::BarCode | FieldMode::Pass | FieldMode::Key | FieldMode::String | FieldMode::Color | FieldMode::Tel | FieldMode::Ident | FieldMode::Email | FieldMode::Code | FieldMode::QrCode => {
296            let default = data["def"].as_str().unwrap_or("");
297            let length = data["length"].as_usize().unwrap_or(20);
298            match field_mode {
299                FieldMode::Key => str::Key::new(true, field, title, length).auto(data["auto"].as_bool().unwrap()).verify(data),
300                FieldMode::Pass => {
301                    str::Pass::new(require, field, title, length, default).verify(data)
302                }
303                FieldMode::String => {
304                    str::Str::new(require, field, title, length, default).verify(data)
305                }
306                FieldMode::Color => str::Color::new(require, field, title, default).verify(data),
307                FieldMode::Tel => str::Tel::new(require, field, title, default).verify(data),
308                FieldMode::Ident => str::Ident::new(require, field, title, default).verify(data),
309                FieldMode::Email => str::Email::new(require, field, title, default).verify(data),
310                FieldMode::BarCode => {
311                    str::BarCode::new(require, field, title, default).verify(data)
312                }
313                FieldMode::Code => {
314                    let dec = data["dec"].as_str().unwrap_or("");
315                    str::Code::new(require, field, title, length, dec, default).verify(data)
316                }
317                FieldMode::QrCode => {
318                    str::QrCode::new(require, field, title, length, default).verify(data)
319                }
320                _ => str::Str::new(require, field, title, length, default).verify(data),
321            }
322        }
323        FieldMode::Table => {
324            let table = data["table"].as_str().unwrap();
325            let fields: Vec<&str> = data["fields"].members().map(|x| x.as_str().unwrap()).collect();
326            let api = data["api"].as_str().unwrap();
327            let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
328            table::Table::new(require, field, title, table, fields, api).multiple(multiple_count).verify(data)
329        }
330        FieldMode::Tree => {
331            let table = data["table"].as_str().unwrap();
332            let pid_field = data["pid_field"].as_str().unwrap_or("");
333            let fields: Vec<&str> = data["fields"].members().map(|x| x.as_str().unwrap()).collect();
334            let api = data["api"].as_str().unwrap();
335            let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
336            table::Tree::new(require, field, title, table, pid_field, fields, api).multiple(multiple_count).verify(data)
337        }
338        FieldMode::Text => {
339            let default = data["def"].as_str().unwrap_or("");
340            let length = data["length"].as_i32().unwrap_or(0);
341            text::Text::new(require, field, title, default).length(length).verify(data)
342        }
343        FieldMode::Editor => {
344            let default = data["def"].as_str().unwrap_or("");
345            let length = data["length"].as_i32().unwrap_or(0);
346            text::Editor::new(require, field, title, default).length(length).verify(data)
347        }
348        FieldMode::Json => {
349            let default = data["def"].clone();
350            let length = data["length"].as_i32().unwrap_or(0);
351            text::Json::new(require, field, title, default).length(length).verify(data)
352        }
353        FieldMode::Array => {
354            let default = data["def"].clone();
355            let length = data["length"].as_i32().unwrap_or(0);
356            text::Array::new(require, field, title, default).length(length).verify(data)
357        }
358        FieldMode::Object => {
359            let default = data["def"].clone();
360            let length = data["length"].as_i32().unwrap_or(0);
361            text::Object::new(require, field, title, default).length(length).verify(data)
362        }
363        FieldMode::Url => {
364            let default = data["def"].as_str().unwrap_or("");
365            text::Url::new(require, field, title, default).verify(data)
366        }
367        FieldMode::Files => {
368            let length = data["length"].as_i32().unwrap_or(1);
369            let encrypt = data["encrypt"].as_bool().unwrap_or(false);
370            let size = data["size"].as_usize().unwrap_or(0);
371            let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
372            let default = data["def"].as_str().unwrap_or("");
373
374            let mut files_mode = files::Files::new(require, field, title);
375
376            if length > 1 {
377                files_mode.multiple(length);
378            }
379            if encrypt {
380                files_mode.encrypt();
381            }
382            files_mode.def(default);
383            files_mode.size(size);
384            files_mode.option(option);
385            files_mode.verify(data)
386        }
387        FieldMode::Float => {
388            let length = data["length"].as_i32().unwrap();
389            let dec = data["dec"].as_usize().unwrap();
390            let default = data["def"].as_f64().unwrap();
391            float::Float::new(require, field, title, length, dec, default).verify(data)
392        }
393        FieldMode::Int => {
394            let length = data["length"].as_i32().unwrap();
395            let default = data["def"].as_i64().unwrap();
396            int::Int::new(require, field, title, length, default).verify(data)
397        }
398        FieldMode::Switch => {
399            let default = data["def"].to_string().parse::<u8>().unwrap();
400            let default = default == 1;
401            int::Switch::new(require, field, title, default).verify(data)
402        }
403        FieldMode::Year | FieldMode::Date | FieldMode::Datetime | FieldMode::Time | FieldMode::Timestamp => {
404            let default = data["def"].as_str().unwrap_or("");
405            match field_mode {
406                FieldMode::Datetime => {
407                    datetime::Datetime::new(require, field, title, default).verify(data)
408                }
409                FieldMode::Year => datetime::Year::new(require, field, title, default).verify(data),
410                FieldMode::Date => datetime::Date::new(require, field, title, default).verify(data),
411                FieldMode::Time => datetime::Time::new(require, field, title, default).verify(data),
412                FieldMode::Timestamp => {
413                    let dec = data["dec"].as_i32().unwrap();
414                    let default = data["def"].as_f64().unwrap_or(0.0);
415                    datetime::Timestamp::new(require, field, title, dec, default).verify(data)
416                }
417                _ => datetime::Datetime::new(require, field, title, default).verify(data),
418            }
419        }
420
421        FieldMode::Select => {
422            let option: Vec<&str> = data["option"].members().map(|c| c.as_str().unwrap()).collect();
423            let def: Vec<&str> = data["def"].members().map(|c| c.as_str().unwrap()).collect();
424            select::Select::new(require, field, title, option, def).verify(data)
425        }
426        FieldMode::Radio => {
427            let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
428            select::Radio::new(require, field, title, option, data["def"].as_str().unwrap()).verify(data)
429        }
430
431        FieldMode::Location => {
432            let default = data["def"].as_str().unwrap_or("");
433            location::Location::new(require, field, title).def(default).verify(data)
434        }
435        FieldMode::Dict => {
436            let table = data["table"].as_str().unwrap();
437            let fields = data["fields"].as_str().unwrap_or("");
438            let api = data["api"].as_str().unwrap();
439            let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
440            dict::Dict::new(require, field, title, table, fields, api).multiple(multiple_count).verify(data)
441        }
442        FieldMode::Polygon => {
443            let default = data["def"].clone();
444            let length = data["length"].as_i32().unwrap_or(0);
445            text::Array::new(require, field, title, default).length(length).verify(data)
446        }
447    }
448}