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;
11pub mod parser;
13pub 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 .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}