lang_turtle/lang/
mod.rs

1use chumsky::{Parser as _, Stream};
2use context::Context;
3use lsp_core::{prelude::PToken, util::Spanned};
4use lsp_types::Url;
5use model::Turtle;
6use tokenizer::parse_tokens_str_safe;
7
8pub mod context;
9pub mod formatter;
10pub mod model;
11// pub mod model2;
12pub mod parser;
13// pub mod parser2;
14pub mod tokenizer;
15
16pub fn parse_source(url: &Url, string: &str) -> (Option<Turtle>, Vec<String>) {
17    let context = Context::new();
18    let ctx = context.ctx();
19
20    let parser = parser::turtle(url, ctx);
21
22    let tokens = match parse_tokens_str_safe(string) {
23        Ok(t) => t,
24        Err(e) => {
25            return (None, e.into_iter().map(|x| x.to_string()).collect());
26        }
27    };
28
29    let end = string.len()..string.len();
30    let stream = Stream::from_iter(
31        end,
32        tokens
33            .into_iter()
34            .enumerate()
35            .filter(|(_, x)| !x.is_comment())
36            .map(|(i, t)| t.map(|x| PToken(x, i)))
37            // .rev()
38            .map(|Spanned(x, y)| (x, y)),
39    );
40
41    let (t, es) = parser.parse_recovery(stream);
42    (t, es.into_iter().map(|x| x.to_string()).collect())
43}