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
20#[cfg(feature = "imports")]
21pub use wgsl::ImportStatementParser;
22
23pub use wgsl::{
24 ExpressionParser, GlobalDeclParser, GlobalDirectiveParser, LiteralParser, StatementParser,
25 TranslationUnitParser, TryTemplateListParser,
26};
27
28pub fn parse_str(source: &str) -> Result<TranslationUnit, Error> {
32 let lexer = Lexer::new(source);
33 let parser = TranslationUnitParser::new();
34 parser.parse(lexer).map_err(Into::into)
35}
36
37pub fn recognize_str(source: &str) -> Result<(), Error> {
41 let lexer = Lexer::new(source);
42 let parser = wgsl_recognize::TranslationUnitParser::new();
43 parser.parse(lexer).map_err(Into::into)
44}
45
46pub fn recognize_template_list(lexer: impl TokenIterator) -> Result<(), Error> {
47 let parser = TryTemplateListParser::new();
48 parser.parse(lexer).map(|_| ()).map_err(Into::into)
49}
50
51impl FromStr for TranslationUnit {
52 type Err = Error;
53
54 fn from_str(source: &str) -> Result<Self, Self::Err> {
55 let lexer = Lexer::new(source);
56 let parser = TranslationUnitParser::new();
57 parser.parse(lexer).map_err(Into::into)
58 }
59}
60impl FromStr for GlobalDirective {
61 type Err = Error;
62
63 fn from_str(source: &str) -> Result<Self, Self::Err> {
64 let lexer = Lexer::new(source);
65 let parser = GlobalDirectiveParser::new();
66 parser.parse(lexer).map_err(Into::into)
67 }
68}
69impl FromStr for GlobalDeclaration {
70 type Err = Error;
71
72 fn from_str(source: &str) -> Result<Self, Self::Err> {
73 let lexer = Lexer::new(source);
74 let parser = GlobalDeclParser::new();
75 parser.parse(lexer).map_err(Into::into)
76 }
77}
78impl FromStr for Statement {
79 type Err = Error;
80
81 fn from_str(source: &str) -> Result<Self, Self::Err> {
82 let lexer = Lexer::new(source);
83 let parser = StatementParser::new();
84 parser.parse(lexer).map_err(Into::into)
85 }
86}
87impl FromStr for Expression {
88 type Err = Error;
89
90 fn from_str(source: &str) -> Result<Self, Self::Err> {
91 let lexer = Lexer::new(source);
92 let parser = ExpressionParser::new();
93 parser.parse(lexer).map_err(Into::into)
94 }
95}
96#[cfg(feature = "imports")]
97impl FromStr for crate::syntax::ImportStatement {
98 type Err = Error;
99
100 fn from_str(source: &str) -> Result<Self, Self::Err> {
101 let lexer = Lexer::new(source);
102 let parser = ImportStatementParser::new();
103 parser.parse(lexer).map_err(Into::into)
104 }
105}