1use std::str::FromStr;
2
3use crate::{
4 error::Error,
5 lexer::{Lexer, TokenIterator},
6 syntax::{Expression, GlobalDeclaration, GlobalDirective, Statement, TranslationUnit},
7};
8
9use lalrpop_util::lalrpop_mod;
10
11lalrpop_mod!(
12 #[allow(clippy::all, reason = "generated code")]
13 wgsl
14);
15lalrpop_mod!(
16 #[allow(clippy::all, reason = "generated code")]
17 wgsl_recognize
18);
19
20pub use wgsl::*;
21
22pub fn parse_str(source: &str) -> Result<TranslationUnit, Error> {
26 let lexer = Lexer::new(source);
27 let parser = TranslationUnitParser::new();
28 parser.parse(lexer).map_err(Into::into)
29}
30
31pub fn recognize_str(source: &str) -> Result<(), Error> {
35 let lexer = Lexer::new(source);
36 let parser = wgsl_recognize::TranslationUnitParser::new();
37 parser.parse(lexer).map_err(Into::into)
38}
39
40pub fn recognize_template_list(lexer: impl TokenIterator) -> Result<(), Error> {
41 let parser = TryTemplateListParser::new();
42 parser.parse(lexer).map(|_| ()).map_err(Into::into)
43}
44
45impl FromStr for TranslationUnit {
46 type Err = Error;
47
48 fn from_str(source: &str) -> Result<Self, Self::Err> {
49 let lexer = Lexer::new(source);
50 let parser = TranslationUnitParser::new();
51 parser.parse(lexer).map_err(Into::into)
52 }
53}
54impl FromStr for GlobalDirective {
55 type Err = Error;
56
57 fn from_str(source: &str) -> Result<Self, Self::Err> {
58 let lexer = Lexer::new(source);
59 let parser = GlobalDirectiveParser::new();
60 parser.parse(lexer).map_err(Into::into)
61 }
62}
63impl FromStr for GlobalDeclaration {
64 type Err = Error;
65
66 fn from_str(source: &str) -> Result<Self, Self::Err> {
67 let lexer = Lexer::new(source);
68 let parser = GlobalDeclParser::new();
69 parser.parse(lexer).map_err(Into::into)
70 }
71}
72impl FromStr for Statement {
73 type Err = Error;
74
75 fn from_str(source: &str) -> Result<Self, Self::Err> {
76 let lexer = Lexer::new(source);
77 let parser = StatementParser::new();
78 parser.parse(lexer).map_err(Into::into)
79 }
80}
81impl FromStr for Expression {
82 type Err = Error;
83
84 fn from_str(source: &str) -> Result<Self, Self::Err> {
85 let lexer = Lexer::new(source);
86 let parser = ExpressionParser::new();
87 parser.parse(lexer).map_err(Into::into)
88 }
89}
90#[cfg(feature = "imports")]
91impl FromStr for crate::syntax::ImportStatement {
92 type Err = Error;
93
94 fn from_str(source: &str) -> Result<Self, Self::Err> {
95 let lexer = Lexer::new(source);
96 let parser = ImportStatementParser::new();
97 parser.parse(lexer).map_err(Into::into)
98 }
99}