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(),
}
}
}