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