graphgate_schema/
type_ext.rs1use 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}