/*! Frontend for [WGSL][wgsl] (WebGPU Shading Language). [wgsl]: https://gpuweb.github.io/gpuweb/wgsl.html */ mod error; mod index; mod lower; mod parse; #[cfg(test)] mod tests; mod to_wgsl; use crate::front::wgsl::error::Error; use crate::front::wgsl::parse::Parser; use thiserror::Error; pub use crate::front::wgsl::error::ParseError; use crate::front::wgsl::lower::Lowerer; use crate::Scalar; pub struct Frontend { parser: Parser, } impl Frontend { pub const fn new() -> Self { Self { parser: Parser::new(), } } pub fn parse(&mut self, source: &str) -> Result { self.inner(source).map_err(|x| x.as_parse_error(source)) } fn inner<'a>(&mut self, source: &'a str) -> Result> { let tu = self.parser.parse(source)?; let index = index::Index::generate(&tu)?; let module = Lowerer::new(&index).lower(&tu)?; Ok(module) } } ///
// NOTE: Keep this in sync with `wgpu::Device::create_shader_module`! // NOTE: Keep this in sync with `wgpu_core::Global::device_create_shader_module`! /// /// This function may consume a lot of stack space. Compiler-enforced limits for parsing recursion /// exist; if shader compilation runs into them, it will return an error gracefully. However, on /// some build profiles and platforms, the default stack size for a thread may be exceeded before /// this limit is reached during parsing. Callers should ensure that there is enough stack space /// for this, particularly if calls to this method are exposed to user input. /// ///
pub fn parse_str(source: &str) -> Result { Frontend::new().parse(source) }