1use json::{JsonValue, object};
2
3pub mod str;
4pub mod int;
5pub mod text;
6pub mod float;
7pub mod select;
8pub mod datetime;
9
10pub trait Field {
11 fn sql(&mut self, model: &str) -> String;
12 fn field(&mut self) -> JsonValue;
13 fn verify(&mut self, data: JsonValue) -> JsonValue {
15 data
16 }
17}
18
19pub fn field(model: &str, field: &str, data: JsonValue) -> String {
21 let mut row = format!("");
22 let mode = data["mode"].as_str().unwrap();
23 let require = data["require"].as_bool().unwrap_or(false);
24 let title = data["title"].as_str().unwrap_or("未知标题");
25 match mode {
26 "autokey" => {
27 row = int::AutoKey::new(true, field.clone(), title.clone()).sql(model);
28 }
29 "key" => {
30 let length = data["length"].as_i32().unwrap();
31 row = str::Key::new(true, field.clone(), title.clone(), length.clone()).sql(model);
32 }
33 "pass" => {
34 let default = data["def"].as_str().unwrap();
35 let length = data["length"].as_i32().unwrap();
36 row = str::Pass::new(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).sql(model);
37 }
38 "string" => {
39 let default = data["def"].as_str().unwrap_or("");
40 let length = data["length"].as_i32().unwrap_or(20);
41 row = str::Str::new(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).sql(model);
42 }
43 "color" => {
44 let default = data["def"].as_str().unwrap_or("");
45 row = str::Color::new(require.clone(), field.clone(), title.clone(), default.clone()).sql(model);
46 }
47 "tel" => {
48 let default = data["def"].as_str().unwrap_or("");
49 row = str::Tel::new(require.clone(), field.clone(), title.clone(), default.clone()).sql(model);
50 }
51 "email" => {
52 let default = data["def"].as_str().unwrap_or("");
53 row = str::Email::new(require.clone(), field.clone(), title.clone(), default.clone()).sql(model);
54 }
55 "table" => {
56 let table = data["table"].as_str().unwrap();
57 let fields: Vec<&str> = data["fields"].members().map(|x| x.as_str().unwrap()).collect();
58 let api = data["api"].as_str().unwrap();
59 row = text::Table::new(require.clone(), field.clone(), title.clone(),
60 table.clone(), fields.clone(), api.clone()).sql(model);
61 }
62 "text" => {
63 let default = data["def"].as_str().unwrap_or("");
64 row = text::Text::new(require.clone(), field.clone(), title.clone(), default.clone()).sql(model);
65 }
66 "url" => {
67 let default = data["def"].as_str().unwrap_or("");
68 row = text::Url::new(require.clone(), field.clone(), title.clone(), default.clone()).sql(model);
69 }
70 "file" => {
71 let length = data["length"].as_i32().unwrap_or(1);
72 let encrypt = data["encrypt"].as_bool().unwrap_or(false);
73 let size = data["size"].as_usize().unwrap_or(0);
74 let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
75
76 row = text::File::new(require.clone(), field.clone(), title.clone(), length.clone(), encrypt, size, option).sql(model);
77 }
78 "json" => {
79 let default = data["def"].clone();
80 row = text::Json::new(require.clone(), field.clone(), title.clone(), default.clone()).sql(model);
81 }
82 "float" => {
83 let length = data["length"].as_i32().unwrap();
84 let dec = data["dec"].as_usize().unwrap();
85 let default = data["def"].as_f32().unwrap();
86 row = float::Float::new(require.clone(), field.clone(), title.clone(),
87 length.clone(), dec.clone(),
88 default.clone()).sql(model);
89 }
90 "int" => {
91 let length = data["length"].as_i32().unwrap();
92 let default = data["def"].as_i64().unwrap();
93 row = int::Int::new(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).sql(model);
94 }
95 "switch" => {
96 let default = data["def"].as_bool().unwrap_or(false);
97 row = int::Switch::new(require.clone(), field.clone(), title.clone(),
98 default.clone()).sql(model);
99 }
100 "datetime" => {
101 let default = data["def"].as_str().unwrap();
102 row = datetime::Datetime::new(require.clone(), field.clone(), title.clone(),
103 default.clone()).sql(model);
104 }
105 "year" => {
106 let default = data["def"].as_u64().unwrap();
107 row = datetime::Year::new(require.clone(), field.clone(), title.clone(),
108 default.clone()).sql(model);
109 }
110 "date" => {
111 let default = data["def"].as_str().unwrap();
112 row = datetime::Date::new(require.clone(), field.clone(), title.clone(),
113 default.clone()).sql(model);
114 }
115 "time" => {
116 let default = data["def"].as_str().unwrap();
117 row = datetime::Time::new(require.clone(), field.clone(), title.clone(),
118 default.clone()).sql(model);
119 }
120 "timestamp" => {
121 let dec = data["dec"].as_i32().unwrap();
122 let default = data["def"].as_f64().unwrap_or(0.0);
123 row = datetime::Timestamp::new(require.clone(), field.clone(), title.clone(),
124 dec.clone(), default.clone()).sql(model);
125 }
126 "select" => {
127 let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
128 let def: Vec<&str> = data["def"].members().map(|x| x.as_str().unwrap()).collect();
129 row = select::Select::new(require.clone(), field.clone(), title.clone(),
130 option.clone(), def.clone()).sql(model);
131 }
132 "radio" => {
133 let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
134 row = select::Radio::new(require.clone(), field.clone(), title.clone(),
135 option.clone(), data["def"].as_str().unwrap()).sql(model);
136 }
137 _ => {
138 println!("未知mode: {}", mode);
139 }
140 }
141 format!("{}", row.clone())
142}
143
144pub fn verify(field: &str, data: JsonValue) -> JsonValue {
146 let mode = data["mode"].as_str().unwrap();
147 let require = data["require"].as_bool().unwrap_or(false);
148 let title = data["title"].as_str().unwrap_or("未知标题");
149 match mode {
150 "autokey" => {
151 int::AutoKey::new(true, field.clone(), title.clone()).verify(data.clone())
152 }
153 "key" => {
154 let length = data["length"].as_i32().unwrap();
155 str::Key::new(true, field.clone(), title.clone(), length.clone()).verify(data.clone())
156 }
157 "pass" => {
158 let default = data["def"].as_str().unwrap();
159 let length = data["length"].as_i32().unwrap();
160 str::Pass::new(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).verify(data.clone())
161 }
162 "string" => {
163 let default = data["def"].as_str().unwrap_or("");
164 let length = data["length"].as_i32().unwrap_or(20);
165 str::Str::new(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).verify(data.clone())
166 }
167 "color" => {
168 let default = data["def"].as_str().unwrap_or("");
169 str::Color::new(require.clone(), field.clone(), title.clone(), default.clone()).verify(data.clone())
170 }
171 "tel" => {
172 let default = data["def"].as_str().unwrap_or("");
173 str::Tel::new(require.clone(), field.clone(), title.clone(), default.clone()).verify(data.clone())
174 }
175 "email" => {
176 let default = data["def"].as_str().unwrap_or("");
177 str::Email::new(require.clone(), field.clone(), title.clone(), default.clone()).verify(data.clone())
178 }
179 "table" => {
180 let table = data["table"].as_str().unwrap();
181 let fields: Vec<&str> = data["fields"].members().map(|x| x.as_str().unwrap()).collect();
182 let api = data["api"].as_str().unwrap();
183 text::Table::new(require.clone(), field.clone(), title.clone(),
184 table.clone(), fields.clone(), api.clone()).verify(data.clone())
185 }
186 "text" => {
187 let default = data["def"].as_str().unwrap_or("");
188 text::Text::new(require.clone(), field.clone(), title.clone(), default.clone()).verify(data.clone())
189 }
190 "url" => {
191 let default = data["def"].as_str().unwrap_or("");
192 text::Url::new(require.clone(), field.clone(), title.clone(), default.clone()).verify(data.clone())
193 }
194 "file" => {
195 let length = data["length"].as_i32().unwrap_or(1);
196 let encrypt = data["encrypt"].as_bool().unwrap_or(false);
197 let size = data["size"].as_usize().unwrap_or(0);
198 let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
199 text::File::new(require.clone(), field.clone(), title.clone(), length.clone(), encrypt, size, option).verify(data.clone())
200 }
201 "json" => {
202 let default = data["def"].clone();
203 text::Json::new(require.clone(), field.clone(), title.clone(),
204 default).verify(data.clone())
205 }
206 "float" => {
207 let length = data["length"].as_i32().unwrap();
208 let dec = data["dec"].as_usize().unwrap();
209 let default = data["def"].as_f32().unwrap();
210 float::Float::new(require.clone(), field.clone(), title.clone(),
211 length.clone(), dec.clone(),
212 default.clone()).verify(data.clone())
213 }
214 "int" => {
215 let length = data["length"].as_i32().unwrap();
216 let default = data["def"].as_i64().unwrap();
217 int::Int::new(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).verify(data.clone())
218 }
219 "switch" => {
220 let default = data["def"].as_bool().unwrap_or(false);
221 int::Switch::new(require.clone(), field.clone(), title.clone(),
222 default.clone()).verify(data.clone())
223 }
224 "datetime" => {
225 let default = data["def"].as_str().unwrap();
226 datetime::Datetime::new(require.clone(), field.clone(), title.clone(),
227 default.clone()).verify(data.clone())
228 }
229 "year" => {
230 let default = data["def"].as_u64().unwrap();
231 datetime::Year::new(require.clone(), field.clone(), title.clone(),
232 default.clone()).verify(data.clone())
233 }
234 "date" => {
235 let default = data["def"].as_str().unwrap();
236 datetime::Date::new(require.clone(), field.clone(), title.clone(),
237 default.clone()).verify(data.clone())
238 }
239 "time" => {
240 let default = data["def"].as_str().unwrap();
241 datetime::Time::new(require.clone(), field.clone(), title.clone(),
242 default.clone()).verify(data.clone())
243 }
244 "timestamp" => {
245 let dec = data["dec"].as_i32().unwrap();
246 let default = data["def"].as_f64().unwrap_or(0.0);
247 datetime::Timestamp::new(require.clone(), field.clone(), title.clone(),
248 dec.clone(), default.clone()).verify(data.clone())
249 }
250 "select" => {
251 let option: Vec<&str> = data["option"].members().map(|c| c.as_str().unwrap()).collect();
252 let def: Vec<&str> = data["def"].members().map(|c| c.as_str().unwrap()).collect();
253 select::Select::new(require.clone(), field.clone(), title.clone(),
254 option.clone(), def.clone()).verify(data.clone())
255 }
256 "radio" => {
257 let option: Vec<&str> = data["option"].members().map(|x| x.as_str().unwrap()).collect();
258 select::Radio::new(require.clone(), field.clone(), title.clone(),
259 option.clone(), data["def"].as_str().unwrap()).verify(data.clone())
260 }
261 _ => {
262 println!("未知mode: {}", mode);
263 object! {}
264 }
265 }
266}