gitql_ast/types/
time.rs

1use std::any::Any;
2
3use crate::expression::Expr;
4use crate::expression::StringExpr;
5use crate::format_checker::is_valid_time_format;
6use crate::types::array::ArrayType;
7
8use super::base::DataType;
9
10#[derive(Clone)]
11pub struct TimeType;
12
13impl DataType for TimeType {
14    fn literal(&self) -> String {
15        "Time".to_string()
16    }
17
18    fn equals(&self, other: &Box<dyn DataType>) -> bool {
19        other.is_any() || other.is_time() || other.is_variant_with(|t| t.is_time())
20    }
21
22    fn as_any(&self) -> &dyn Any {
23        self
24    }
25
26    fn can_perform_eq_op_with(&self) -> Vec<Box<dyn DataType>> {
27        vec![Box::new(TimeType)]
28    }
29
30    fn can_perform_group_eq_op_with(&self) -> Vec<Box<dyn DataType>> {
31        vec![Box::new(ArrayType::new(Box::new(TimeType)))]
32    }
33
34    fn can_perform_bang_eq_op_with(&self) -> Vec<Box<dyn DataType>> {
35        vec![Box::new(TimeType)]
36    }
37
38    fn can_perform_group_bang_eq_op_with(&self) -> Vec<Box<dyn DataType>> {
39        vec![Box::new(ArrayType::new(Box::new(TimeType)))]
40    }
41
42    fn can_perform_gt_op_with(&self) -> Vec<Box<dyn DataType>> {
43        vec![Box::new(TimeType)]
44    }
45
46    fn can_perform_group_gt_op_with(&self) -> Vec<Box<dyn DataType>> {
47        vec![Box::new(ArrayType::new(Box::new(TimeType)))]
48    }
49
50    fn can_perform_gte_op_with(&self) -> Vec<Box<dyn DataType>> {
51        vec![Box::new(TimeType)]
52    }
53
54    fn can_perform_group_gte_op_with(&self) -> Vec<Box<dyn DataType>> {
55        vec![Box::new(ArrayType::new(Box::new(TimeType)))]
56    }
57
58    fn can_perform_lt_op_with(&self) -> Vec<Box<dyn DataType>> {
59        vec![Box::new(TimeType)]
60    }
61
62    fn can_perform_group_lt_op_with(&self) -> Vec<Box<dyn DataType>> {
63        vec![Box::new(ArrayType::new(Box::new(TimeType)))]
64    }
65
66    fn can_perform_lte_op_with(&self) -> Vec<Box<dyn DataType>> {
67        vec![Box::new(TimeType)]
68    }
69
70    fn can_perform_group_lte_op_with(&self) -> Vec<Box<dyn DataType>> {
71        vec![Box::new(ArrayType::new(Box::new(TimeType)))]
72    }
73
74    fn has_implicit_cast_from(&self, expr: &Box<dyn Expr>) -> bool {
75        if let Some(string_expr) = expr.as_any().downcast_ref::<StringExpr>() {
76            return is_valid_time_format(&string_expr.value);
77        }
78        false
79    }
80}