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}