1mod error;
8mod index;
9mod lower;
10mod parse;
11#[cfg(test)]
12mod tests;
13mod to_wgsl;
14
15use crate::front::wgsl::error::Error;
16use crate::front::wgsl::parse::Parser;
17use thiserror::Error;
18
19pub use crate::front::wgsl::error::ParseError;
20use crate::front::wgsl::lower::Lowerer;
21use crate::Scalar;
22
23pub struct Frontend {
24 parser: Parser,
25}
26
27impl Frontend {
28 pub const fn new() -> Self {
29 Self {
30 parser: Parser::new(),
31 }
32 }
33
34 pub fn parse(&mut self, source: &str) -> Result<crate::Module, ParseError> {
35 self.inner(source).map_err(|x| x.as_parse_error(source))
36 }
37
38 fn inner<'a>(&mut self, source: &'a str) -> Result<crate::Module, Error<'a>> {
39 let tu = self.parser.parse(source)?;
40 let index = index::Index::generate(&tu)?;
41 let module = Lowerer::new(&index).lower(&tu)?;
42
43 Ok(module)
44 }
45}
46
47pub fn parse_str(source: &str) -> Result<crate::Module, ParseError> {
59 Frontend::new().parse(source)
60}
61
62#[cfg(test)]
63#[track_caller]
64pub fn assert_parse_err(input: &str, snapshot: &str) {
65 let output = parse_str(input)
66 .expect_err("expected parser error")
67 .emit_to_string(input);
68 if output != snapshot {
69 for diff in diff::lines(snapshot, &output) {
70 match diff {
71 diff::Result::Left(l) => println!("-{l}"),
72 diff::Result::Both(l, _) => println!(" {l}"),
73 diff::Result::Right(r) => println!("+{r}"),
74 }
75 }
76 panic!("Error snapshot failed");
77 }
78}