Skip to main content

parse_source

Function parse_source 

Source
pub fn parse_source(
    source_id: SourceId,
    text: impl Into<Arc<str>>,
) -> Result<ParsedSource, ParseError>
Expand description

Parses text into a ParsedSource, collecting recoverable syntax diagnostics rather than failing on imperfect input.

Examples found in repository?
examples/conformance.rs (line 24)
13fn main() {
14    let path = std::env::args()
15        .nth(1)
16        .expect("usage: conformance <corpus.json>");
17    let raw = std::fs::read_to_string(&path).expect("corpus file readable");
18    let corpus: Vec<String> = parse_json_strings(&raw);
19
20    let mut failures = 0usize;
21    let mut report = String::new();
22    for (index, query) in corpus.iter().enumerate() {
23        let source = surrealguard_syntax::source::SourceId::new(format!("corpus:{index}"));
24        let Ok(parsed) = surrealguard_syntax::parse::parse_source(source, query.as_str()) else {
25            failures += 1;
26            let _ = writeln!(report, "#{index}: parser returned no tree");
27            continue;
28        };
29        if let Some(range) = first_broken_range(parsed.tree().root_node()) {
30            failures += 1;
31            let snippet: String = query[range.clone()].chars().take(60).collect();
32            let context: String = query.chars().take(80).collect();
33            let _ = writeln!(
34                report,
35                "#{index}: ERROR at {range:?}: `{}`\n    in: {}",
36                snippet.replace('\n', " "),
37                context.replace('\n', " ")
38            );
39        }
40    }
41
42    print!("{report}");
43    println!(
44        "---\n{failures}/{} corpus entries fail to parse",
45        corpus.len()
46    );
47    if failures > 0 {
48        std::process::exit(1);
49    }
50}