gitql_std/
meta_types.rs

1use gitql_ast::types::array::ArrayType;
2use gitql_ast::types::DataType;
3
4/// Returns the type of of first element
5/// (T1, T2, ...) -> T1
6#[inline(always)]
7pub fn first_element_type(elements: &[Box<dyn DataType>]) -> Box<dyn DataType> {
8    elements[0].clone()
9}
10
11/// Returns the type of second element
12/// (T1, T2, ...) -> T2
13#[inline(always)]
14pub fn second_element_type(elements: &[Box<dyn DataType>]) -> Box<dyn DataType> {
15    elements[0].clone()
16}
17
18/// Returns Array type of the passed element type
19/// T -> Array<T>
20#[inline(always)]
21pub fn array_of_type(element_type: Box<dyn DataType>) -> Box<dyn DataType> {
22    Box::new(ArrayType {
23        base: element_type.clone(),
24    })
25}
26
27/// Returns element type of passed Array type
28/// Array<T> -> T
29#[inline(always)]
30pub fn array_element_type(array: Box<dyn DataType>) -> Box<dyn DataType> {
31    if let Some(other_array) = array.as_any().downcast_ref::<ArrayType>() {
32        return other_array.base.clone();
33    }
34    panic!("Expect Array type")
35}