1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
use crate::Generator;
use crate::Indentation;

#[derive(Debug)]
pub enum DataType {
    Named(String),
    Nullable(Box<DataType>),
    Union(Vec<DataType>),
    Intersection(Vec<DataType>),
    Void,
    Null,
    True,
    False,
    Never,
    Float,
    Boolean,
    Integer,
    String,
    Array,
    Object,
    Mixed,
    Callable,
    Iterable,
    StaticReference,
    SelfReference,
    ParentReference,
}

impl Generator for DataType {
    fn generate(&self, _indentation: Indentation, _level: usize) -> String {
        match self {
            DataType::Named(name) => name.to_string(),
            DataType::Nullable(inner) => {
                format!("?{}", inner.generate(_indentation, _level))
            }
            DataType::Union(inner) => inner
                .iter()
                .map(|t| t.generate(_indentation, _level))
                .collect::<Vec<String>>()
                .join("|"),
            DataType::Intersection(inner) => inner
                .iter()
                .map(|t| t.generate(_indentation, _level))
                .collect::<Vec<String>>()
                .join("&"),
            DataType::Null => "null".to_string(),
            DataType::True => "true".to_string(),
            DataType::False => "false".to_string(),
            DataType::Float => "float".to_string(),
            DataType::Boolean => "bool".to_string(),
            DataType::Integer => "int".to_string(),
            DataType::String => "string".to_string(),
            DataType::Array => "array".to_string(),
            DataType::Object => "object".to_string(),
            DataType::Mixed => "mixed".to_string(),
            DataType::Callable => "callable".to_string(),
            DataType::Iterable => "iterable".to_string(),
            DataType::StaticReference => "static".to_string(),
            DataType::SelfReference => "self".to_string(),
            DataType::ParentReference => "parent".to_string(),
            DataType::Void => "void".to_string(),
            DataType::Never => "never".to_string(),
        }
    }
}