avocado_schema/core/field/
datetime.rs

1use 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}