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 fields: Vec<&str> = data["fields"].members().map(|x| x.as_str().unwrap()).collect();
138            let api = data["api"].as_str().unwrap();
139            let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
140            table::Tree::new(require, field, title, table, fields, api).multiple(multiple_count).sql(model)
141        }
142        FieldMode::Text => {
143            let default = data["def"].as_str().unwrap_or("");
144            let length = data["length"].as_i32().unwrap_or(0);
145            text::Text::new(require, field, title, default).length(length).sql(model)
146        }
147        FieldMode::Editor => {
148            let default = data["def"].as_str().unwrap_or("");
149            let length = data["length"].as_i32().unwrap_or(0);
150            text::Editor::new(require, field, title, default).length(length).sql(model)
151        }
152        FieldMode::Json => {
153            let default = data["def"].clone();
154            let length = data["length"].as_i32().unwrap_or(0);
155            text::Json::new(require, field, title, default).length(length).sql(model)
156        }
157        FieldMode::Array => {
158            let default = data["def"].clone();
159            let length = data["length"].as_i32().unwrap_or(0);
160            text::Array::new(require, field, title, default).length(length).sql(model)
161        }
162        FieldMode::Object => {
163            let default = data["def"].clone();
164            let length = data["length"].as_i32().unwrap_or(0);
165            text::Object::new(require, field, title, default).length(length).sql(model)
166        }
167        FieldMode::Url => {
168            let default = data["def"].as_str().unwrap_or("");
169            text::Url::new(require, field, title, default).sql(model)
170        }
171        FieldMode::Files => {
172            let length = data["length"].as_i32().unwrap_or(1);
173            let encrypt = data["encrypt"].as_bool().unwrap_or(false);
174            let size = data["size"].as_usize().unwrap_or(0);
175            let default = data["def"].as_str().unwrap_or("");
176            let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
177            let mut files_mode = files::Files::new(require, field, title);
178
179            if length > 1 {
180                files_mode.multiple(length);
181            }
182            if encrypt {
183                files_mode.encrypt();
184            }
185            files_mode.def(default);
186            files_mode.size(size);
187            files_mode.option(option);
188            files_mode.sql(model)
189        }
190        FieldMode::Float => {
191            let length = data["length"].as_i32().unwrap();
192            let dec = data["dec"].as_usize().unwrap();
193            let default = data["def"].to_string().parse::<f64>().unwrap_or(0.0);
194            float::Float::new(require, field, title, length, dec, default).sql(model)
195        }
196        FieldMode::Int => {
197            let length = data["length"].as_i32().unwrap();
198            let default = data["def"].as_i64().unwrap();
199            int::Int::new(require, field, title, length, default).sql(model)
200        }
201        FieldMode::Switch => {
202            let default = data["def"].to_string().parse::<bool>().unwrap();
203            int::Switch::new(require, field, title, default).sql(model)
204        }
205        FieldMode::Datetime => {
206            let default = data["def"].as_str().unwrap_or("");
207            datetime::Datetime::new(require, field, title, default).sql(model)
208        }
209        FieldMode::Year => {
210            let default = data["def"].as_str().unwrap_or("");
211            datetime::Year::new(require, field, title, default).sql(model)
212        }
213        FieldMode::Date => {
214            let default = data["def"].as_str().unwrap();
215            datetime::Date::new(require, field, title, default).sql(model)
216        }
217        FieldMode::Time => {
218            let default = data["def"].as_str().unwrap();
219            datetime::Time::new(require, field, title, default).sql(model)
220        }
221        FieldMode::Timestamp => {
222            let dec = data["dec"].as_i32().unwrap();
223            let default = data["def"].as_f64().unwrap_or(0.0);
224            datetime::Timestamp::new(require, field, title, dec, default).sql(model)
225        }
226        FieldMode::Select => {
227            let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
228
229            let def: Vec<&str> = data["def"].members().map(|x| x.as_str().unwrap()).collect();
230
231            select::Select::new(require, field, title, option, def).table_name(data["table_name"].as_str().unwrap_or("")).sql(model)
232        }
233        FieldMode::Radio => {
234            let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
235            select::Radio::new(require, field, title, option, data["def"].as_str().unwrap()).table_name(data["table_name"].as_str().unwrap_or("")).sql(model)
236        }
237        FieldMode::Location => {
238            let default = data["def"].as_str().unwrap_or("");
239            location::Location::new(require, field, title).def(default).sql(model)
240        }
241        FieldMode::Dict => {
242            let table = data["table"].as_str().unwrap();
243            let fields = data["fields"].as_str().unwrap_or("");
244            let api = data["api"].as_str().unwrap();
245            let default = data["def"].as_str().unwrap_or("");
246
247            let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
248            dict::Dict::new(require, field, title, table, fields, api).multiple(multiple_count).default(default).sql(model)
249        }
250
251        FieldMode::Key | FieldMode::Pass | FieldMode::String | FieldMode::Code | FieldMode::BarCode | FieldMode::Email | FieldMode::Tel | FieldMode::Ident | FieldMode::Color | FieldMode::QrCode => {
252            let default = data["def"].as_str().unwrap_or("");
253            let dec = data["dec"].as_str().unwrap_or("");
254            let length = data["length"].as_usize().unwrap_or(20);
255            match FieldMode::from(mode) {
256                FieldMode::Code => {
257                    str::Code::new(require, field, title, length, dec, default).sql(model)
258                }
259                FieldMode::BarCode => str::BarCode::new(require, field, title, default).sql(model),
260                FieldMode::Email => str::Email::new(require, field, title, default).sql(model),
261                FieldMode::Tel => str::Tel::new(require, field, title, default).sql(model),
262                FieldMode::Ident => str::Ident::new(require, field, title, default).sql(model),
263                FieldMode::Color => str::Color::new(require, field, title, default).sql(model),
264                FieldMode::String => {
265                    str::Str::new(require, field, title, length, default).sql(model)
266                }
267                FieldMode::Pass => {
268                    str::Pass::new(require, field, title, length, default).sql(model)
269                }
270                FieldMode::Key => str::Key::new(true, field, title, length).auto(data["auto"].as_bool().unwrap()).sql(model),
271                FieldMode::QrCode => {
272                    str::QrCode::new(require, field, title, length, default).sql(model)
273                }
274                _ => str::Str::new(require, field, title, length, default).sql(model),
275            }
276        }
277        FieldMode::Polygon => {
278            let default = data["def"].clone();
279            let length = data["length"].as_i32().unwrap_or(0);
280            text::Array::new(require, field, title, default).length(length).sql(model)
281        }
282    };
283    row.to_string()
284}
285
286/// 验证
287pub fn verify(field: &str, data: JsonValue) -> JsonValue {
288    let mode = data["mode"].as_str().unwrap();
289    let require = data["require"].as_bool().unwrap_or(false);
290    let title = data["title"].as_str().unwrap_or("未知标题");
291    let field_mode = FieldMode::from(mode);
292
293    match field_mode {
294        FieldMode::BarCode | FieldMode::Pass | FieldMode::Key | FieldMode::String | FieldMode::Color | FieldMode::Tel | FieldMode::Ident | FieldMode::Email | FieldMode::Code | FieldMode::QrCode => {
295            let default = data["def"].as_str().unwrap_or("");
296            let length = data["length"].as_usize().unwrap_or(20);
297            match field_mode {
298                FieldMode::Key => str::Key::new(true, field, title, length).auto(data["auto"].as_bool().unwrap()).verify(data),
299                FieldMode::Pass => {
300                    str::Pass::new(require, field, title, length, default).verify(data)
301                }
302                FieldMode::String => {
303                    str::Str::new(require, field, title, length, default).verify(data)
304                }
305                FieldMode::Color => str::Color::new(require, field, title, default).verify(data),
306                FieldMode::Tel => str::Tel::new(require, field, title, default).verify(data),
307                FieldMode::Ident => str::Ident::new(require, field, title, default).verify(data),
308                FieldMode::Email => str::Email::new(require, field, title, default).verify(data),
309                FieldMode::BarCode => {
310                    str::BarCode::new(require, field, title, default).verify(data)
311                }
312                FieldMode::Code => {
313                    let dec = data["dec"].as_str().unwrap_or("");
314                    str::Code::new(require, field, title, length, dec, default).verify(data)
315                }
316                FieldMode::QrCode => {
317                    str::QrCode::new(require, field, title, length, default).verify(data)
318                }
319                _ => str::Str::new(require, field, title, length, default).verify(data),
320            }
321        }
322        FieldMode::Table => {
323            let table = data["table"].as_str().unwrap();
324            let fields: Vec<&str> = data["fields"].members().map(|x| x.as_str().unwrap()).collect();
325            let api = data["api"].as_str().unwrap();
326            let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
327            table::Table::new(require, field, title, table, fields, api).multiple(multiple_count).verify(data)
328        }
329        FieldMode::Tree => {
330            let table = data["table"].as_str().unwrap();
331            let fields: Vec<&str> = data["fields"].members().map(|x| x.as_str().unwrap()).collect();
332            let api = data["api"].as_str().unwrap();
333            let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
334            table::Tree::new(require, field, title, table, fields, api).multiple(multiple_count).verify(data)
335        }
336        FieldMode::Text => {
337            let default = data["def"].as_str().unwrap_or("");
338            let length = data["length"].as_i32().unwrap_or(0);
339            text::Text::new(require, field, title, default).length(length).verify(data)
340        }
341        FieldMode::Editor => {
342            let default = data["def"].as_str().unwrap_or("");
343            let length = data["length"].as_i32().unwrap_or(0);
344            text::Editor::new(require, field, title, default).length(length).verify(data)
345        }
346        FieldMode::Json => {
347            let default = data["def"].clone();
348            let length = data["length"].as_i32().unwrap_or(0);
349            text::Json::new(require, field, title, default).length(length).verify(data)
350        }
351        FieldMode::Array => {
352            let default = data["def"].clone();
353            let length = data["length"].as_i32().unwrap_or(0);
354            text::Array::new(require, field, title, default).length(length).verify(data)
355        }
356        FieldMode::Object => {
357            let default = data["def"].clone();
358            let length = data["length"].as_i32().unwrap_or(0);
359            text::Object::new(require, field, title, default).length(length).verify(data)
360        }
361        FieldMode::Url => {
362            let default = data["def"].as_str().unwrap_or("");
363            text::Url::new(require, field, title, default).verify(data)
364        }
365        FieldMode::Files => {
366            let length = data["length"].as_i32().unwrap_or(1);
367            let encrypt = data["encrypt"].as_bool().unwrap_or(false);
368            let size = data["size"].as_usize().unwrap_or(0);
369            let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
370            let default = data["def"].as_str().unwrap_or("");
371
372            let mut files_mode = files::Files::new(require, field, title);
373
374            if length > 1 {
375                files_mode.multiple(length);
376            }
377            if encrypt {
378                files_mode.encrypt();
379            }
380            files_mode.def(default);
381            files_mode.size(size);
382            files_mode.option(option);
383            files_mode.verify(data)
384        }
385        FieldMode::Float => {
386            let length = data["length"].as_i32().unwrap();
387            let dec = data["dec"].as_usize().unwrap();
388            let default = data["def"].as_f64().unwrap();
389            float::Float::new(require, field, title, length, dec, default).verify(data)
390        }
391        FieldMode::Int => {
392            let length = data["length"].as_i32().unwrap();
393            let default = data["def"].as_i64().unwrap();
394            int::Int::new(require, field, title, length, default).verify(data)
395        }
396        FieldMode::Switch => {
397            let default = data["def"].to_string().parse::<u8>().unwrap();
398            let default = default == 1;
399            int::Switch::new(require, field, title, default).verify(data)
400        }
401        FieldMode::Year | FieldMode::Date | FieldMode::Datetime | FieldMode::Time | FieldMode::Timestamp => {
402            let default = data["def"].as_str().unwrap_or("");
403            match field_mode {
404                FieldMode::Datetime => {
405                    datetime::Datetime::new(require, field, title, default).verify(data)
406                }
407                FieldMode::Year => datetime::Year::new(require, field, title, default).verify(data),
408                FieldMode::Date => datetime::Date::new(require, field, title, default).verify(data),
409                FieldMode::Time => datetime::Time::new(require, field, title, default).verify(data),
410                FieldMode::Timestamp => {
411                    let dec = data["dec"].as_i32().unwrap();
412                    let default = data["def"].as_f64().unwrap_or(0.0);
413                    datetime::Timestamp::new(require, field, title, dec, default).verify(data)
414                }
415                _ => datetime::Datetime::new(require, field, title, default).verify(data),
416            }
417        }
418
419        FieldMode::Select => {
420            let option: Vec<&str> = data["option"].members().map(|c| c.as_str().unwrap()).collect();
421            let def: Vec<&str> = data["def"].members().map(|c| c.as_str().unwrap()).collect();
422            select::Select::new(require, field, title, option, def).verify(data)
423        }
424        FieldMode::Radio => {
425            let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
426            select::Radio::new(require, field, title, option, data["def"].as_str().unwrap()).verify(data)
427        }
428
429        FieldMode::Location => {
430            let default = data["def"].as_str().unwrap_or("");
431            location::Location::new(require, field, title).def(default).verify(data)
432        }
433        FieldMode::Dict => {
434            let table = data["table"].as_str().unwrap();
435            let fields = data["fields"].as_str().unwrap_or("");
436            let api = data["api"].as_str().unwrap();
437            let multiple_count = data["multiple_count"].as_i32().unwrap_or(1);
438            dict::Dict::new(require, field, title, table, fields, api).multiple(multiple_count).verify(data)
439        }
440        FieldMode::Polygon => {
441            let default = data["def"].clone();
442            let length = data["length"].as_i32().unwrap_or(0);
443            text::Array::new(require, field, title, default).length(length).verify(data)
444        }
445    }
446}