gitql_ast/types/
variant.rs1use 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}