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}