avocado_schema/core/field/
datetime.rs1use crate::core::constraint::common::typed::Type;
2use crate::core::constraint::Constraint;
3use crate::core::field::{Field, FieldType};
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Serialize, Deserialize)]
7#[serde(tag = "type", rename = "datetime")]
8pub struct DatetimeField {
9 pub name: String,
10}
11
12impl Field for DatetimeField {
13 const FIELD_TYPE: FieldType = FieldType::DateTime;
14
15 fn name(&self) -> String {
16 self.name.clone()
17 }
18
19 fn constrains(&self) -> Vec<Box<dyn Constraint>> {
20 vec![Box::new(Type {
21 typed: Self::FIELD_TYPE,
22 })]
23 }
24}
25
26#[derive(Default)]
27pub struct DatetimeFieldBuilder {
28 name: String,
29}
30
31impl DatetimeFieldBuilder {
32 pub fn new() -> Self {
33 DatetimeFieldBuilder::default()
34 }
35
36 pub fn name(mut self, name: &'static str) -> Self {
37 self.name = name.to_string();
38 self
39 }
40
41 pub fn build(self) -> DatetimeField {
42 DatetimeField { name: self.name }
43 }
44}
45
46#[cfg(test)]
47mod tests {
48 use crate::core::field::datetime::{DatetimeField, DatetimeFieldBuilder};
49 use crate::visitor::validator::Validator;
50 use chrono::Utc;
51
52 #[test]
53 fn test_serialize() {
54 let field = DatetimeFieldBuilder::new().name("modified").build();
55 let field_json = serde_json::to_string(&field).unwrap();
56 assert_eq!(field_json, r#"{"type":"datetime","name":"modified"}"#)
57 }
58
59 #[test]
60 fn test_deserialize() {
61 let field_json = r#"
62 {
63 "type":"datetime",
64 "name": "modified"
65 }"#;
66 let field: DatetimeField = serde_json::from_str(field_json).unwrap();
67 assert_eq!(field.name, "modified");
68 }
69 #[test]
70 fn test_type() {
71 let field = DatetimeFieldBuilder::new().build();
72 let validator = Validator::new(field);
73
74 assert!(validator.validate(&Utc::now()).is_ok());
75 assert!(validator.validate(&"meeting").is_err());
76 }
77}