teo-parser 0.3.0

Parser for Teo schema language
Documentation
use crate::ast::argument_list::ArgumentList;
use crate::availability::Availability;
use crate::ast::pipeline_item_declaration::PipelineItemDeclaration;
use crate::ast::schema::Schema;
use crate::ast::source::Source;
use crate::ast::unit::Unit;
use crate::search::search_identifier_path::{search_identifier_path_names_with_filter_to_path};
use crate::utils::top_filter::top_filter_for_pipeline;

pub fn search_pipeline_unit_for_auto_completion<HAL, HI, OUTPUT>(
    schema: &Schema,
    source: &Source,
    unit: &Unit,
    namespace_path: &Vec<&str>,
    line_col: (usize, usize),
    handle_argument_list: HAL,
    handle_identifier: HI,
    default: OUTPUT,
    availability: Availability,
) -> OUTPUT where
    HAL: Fn(&ArgumentList, Option<&PipelineItemDeclaration>) -> OUTPUT,
    HI: Fn(&Vec<&str>) -> OUTPUT,
{
    let mut user_typed_prefix: Vec<&str> = vec![];
    for expression in unit.expressions() {
        if let Some(identifier) = expression.kind.as_identifier() {
            if identifier.span.contains_line_col(line_col) {
                return handle_identifier(&user_typed_prefix);
            } else {
                user_typed_prefix.push(identifier.name());
                if let Some(reference) = search_identifier_path_names_with_filter_to_path(&user_typed_prefix, schema, source, namespace_path, &top_filter_for_pipeline(), availability) {
                    if schema.find_top_by_path(&reference).unwrap().is_pipeline_item_declaration() {
                        user_typed_prefix = vec![];
                    }
                } else {
                    user_typed_prefix = vec![];
                }
            }
        } else if let Some(argument_list) = expression.kind.as_argument_list() {
            if argument_list.span.contains_line_col(line_col) {
                return handle_argument_list(argument_list, search_identifier_path_names_with_filter_to_path(&user_typed_prefix, schema, source, namespace_path, &top_filter_for_pipeline(), availability).map(|r| schema.find_top_by_path(&r).unwrap().as_pipeline_item_declaration()).flatten());
            } else {
                user_typed_prefix = vec![];
            }
        }
    }
    if let Some(empty_dot) = unit.empty_dot() {
        if empty_dot.span.contains_line_col(line_col) {
            return handle_identifier(&user_typed_prefix);
        }
    }
    default
}