graphgate_schema/
type_ext.rs

1use parser::types::{BaseType, Type};
2
3pub trait TypeExt {
4    fn concrete_typename(&self) -> &str;
5    fn is_subtype(&self, sub: &Type) -> bool;
6}
7
8impl TypeExt for Type {
9    fn concrete_typename(&self) -> &str {
10        match &self.base {
11            BaseType::Named(name) => name.as_str(),
12            BaseType::List(ty) => ty.concrete_typename(),
13        }
14    }
15
16    fn is_subtype(&self, sub: &Type) -> bool {
17        if !sub.nullable || self.nullable {
18            match (&self.base, &sub.base) {
19                (BaseType::Named(super_type), BaseType::Named(sub_type)) => super_type == sub_type,
20                (BaseType::List(super_type), BaseType::List(sub_type)) => {
21                    super_type.is_subtype(sub_type)
22                }
23                _ => false,
24            }
25        } else {
26            false
27        }
28    }
29}