gitql_ast/types/
variant.rs

1use std::any::Any;
2
3use super::base::DataType;
4
5#[derive(Clone)]
6pub struct VariantType {
7    pub variants: Vec<Box<dyn DataType>>,
8}
9
10impl VariantType {
11    pub fn new(variants: Vec<Box<dyn DataType>>) -> Self {
12        VariantType { variants }
13    }
14}
15
16impl DataType for VariantType {
17    fn literal(&self) -> String {
18        let mut str = String::new();
19        let last_position = self.variants.len() - 1;
20        str += "[";
21        for (pos, data_type) in self.variants.iter().enumerate() {
22            str += &data_type.literal();
23            if pos != last_position {
24                str += " | ";
25            }
26        }
27        str += "]";
28        str
29    }
30
31    fn equals(&self, other: &Box<dyn DataType>) -> bool {
32        if other.is_any() {
33            return true;
34        }
35
36        for variant in self.variants.iter() {
37            if variant.equals(other) {
38                return true;
39            }
40        }
41
42        false
43    }
44
45    fn as_any(&self) -> &dyn Any {
46        self
47    }
48}