teo-parser 0.3.0

Parser for Teo schema language
Documentation
use crate::ast::namespace::Namespace;
use crate::ast::node::Node;
use crate::ast::schema::Schema;
use crate::ast::source::Source;
use crate::traits::node_trait::NodeTrait;

pub(crate) fn search_top<'a>(schema: &'a Schema, file_path: &str, line_col: (usize, usize)) -> Option<&'a Node> {
    if let Some(source) = schema.sources().iter().find(|s| s.file_path.as_str() == file_path) {
        return search_top_in_source(source, line_col);
    }
    None
}

fn search_top_in_source(source: &Source, line_col: (usize, usize)) -> Option<&Node> {
    for top in source.children() {
        if top.span().contains_line_col(line_col) {
            return if let Some(namespace) = top.as_namespace() {
                if let Some(top_in_namespace) = search_top_in_namespace(namespace, line_col) {
                    Some(top_in_namespace)
                } else {
                    Some(top)
                }
            } else {
                Some(top)
            }
        }
    }
    None
}

fn search_top_in_namespace(namespace: &Namespace, line_col: (usize, usize)) -> Option<&Node> {
    for top in namespace.children.values() {
        if top.span().contains_line_col(line_col) {
            return if let Some(namespace) = top.as_namespace() {
                if let Some(top_in_namespace) = search_top_in_namespace(namespace, line_col) {
                    Some(top_in_namespace)
                } else {
                    Some(top)
                }
            } else {
                Some(top)
            }
        }
    }
    None
}