teo_parser/utils/
top_filter.rs

1use std::sync::Arc;
2use crate::ast::node::Node;
3use crate::ast::r#enum::Enum;
4use crate::ast::reference_space::ReferenceSpace;
5use crate::ast::struct_declaration::StructDeclaration;
6use crate::completion::find_completion_in_type_expr::TypeExprFilter;
7use crate::traits::named_identifiable::NamedIdentifiable;
8
9pub fn top_filter_for_reference_type(reference_type: ReferenceSpace) -> Arc<dyn Fn(&Node) -> bool> {
10    match reference_type {
11        ReferenceSpace::EnumDecorator |
12        ReferenceSpace::EnumMemberDecorator |
13        ReferenceSpace::ModelDecorator |
14        ReferenceSpace::ModelFieldDecorator |
15        ReferenceSpace::ModelRelationDecorator |
16        ReferenceSpace::ModelPropertyDecorator |
17        ReferenceSpace::InterfaceDecorator |
18        ReferenceSpace::InterfaceFieldDecorator |
19        ReferenceSpace::HandlerDecorator => Arc::new(move |top: &Node| {
20            top.as_decorator_declaration().map_or(false, |d| d.decorator_class == reference_type)
21        }),
22        ReferenceSpace::PipelineItem => Arc::new(|top: &Node| {
23            top.as_pipeline_item_declaration().is_some()
24        }),
25        ReferenceSpace::Middleware => Arc::new(|top: &Node| {
26            top.as_middleware_declaration().is_some()
27        }),
28        ReferenceSpace::Default => Arc::new(|top: &Node| {
29            top.is_enum() || top.is_model() || top.is_interface_declaration() || top.is_struct_declaration() || top.is_config() || top.is_constant_declaration() || top.is_namespace() || top.is_data_set() || top.is_synthesized_shape_declaration()
30        }),
31    }
32}
33
34pub fn top_filter_for_any_model_field_decorators() -> Arc<dyn Fn(&Node) -> bool> {
35    Arc::new(|top: &Node| {
36        top.as_decorator_declaration().map_or(false, |d| match d.decorator_class {
37            ReferenceSpace::ModelFieldDecorator => true,
38            ReferenceSpace::ModelRelationDecorator => true,
39            ReferenceSpace::ModelPropertyDecorator => true,
40            _ => false,
41        })
42    })
43}
44
45pub fn top_filter_for_pipeline() -> Arc<dyn Fn(&Node) -> bool> {
46    Arc::new(|top: &Node| {
47        top.is_pipeline_item_declaration() || top.is_namespace()
48    })
49}
50
51pub fn top_filter_for_middleware() -> Arc<dyn Fn(&Node) -> bool> {
52    Arc::new(|top: &Node| {
53        top.is_middleware_declaration() || top.is_namespace()
54    })
55}
56
57pub fn top_filter_for_handler_template() -> Arc<dyn Fn(&Node) -> bool> {
58    Arc::new(|top: &Node| {
59        top.is_handler_template_declaration()
60    })
61}
62
63pub fn top_filter_for_model() -> Arc<dyn Fn(&Node) -> bool> {
64    Arc::new(|top: &Node| {
65        top.is_model()
66    })
67}
68
69pub fn top_filter_for_type_expr_filter(type_expr_filter: TypeExprFilter) -> Arc<dyn Fn(&Node) -> bool> {
70    match type_expr_filter {
71        TypeExprFilter::None => Arc::new(|top: &Node| {
72            top.is_model() || top.is_interface_declaration() || top.is_enum() || (top.is_struct_declaration() && !struct_is_builtin(top.as_struct_declaration().unwrap()))
73        }),
74        TypeExprFilter::Model => Arc::new(|top: &Node| {
75            (top.is_enum() && enum_is_normal(top.as_enum().unwrap())) || top.is_model()
76        }),
77        TypeExprFilter::ActionInput => Arc::new(|top: &Node| {
78            top.is_interface_declaration()
79        }),
80    }
81}
82
83fn struct_is_builtin(struct_declaration: &StructDeclaration) -> bool {
84    let str_path = struct_declaration.str_path();
85    if str_path.len() != 2 {
86        return false;
87    }
88    if str_path.first().unwrap() != &"std" {
89        return false;
90    }
91    let last = *str_path.last().unwrap();
92    vec!["String", "Bool", "Null", "Int", "Int64", "Float", "Float32", "Decimal", "ObjectId", "Date", "DateTime", "Array", "Dictionary"].contains(&last)
93}
94
95fn enum_is_normal(enum_declaration: &Enum) -> bool {
96    !enum_declaration.interface && !enum_declaration.option
97}