teo_parser/utils/
top_filter.rs1use 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}