gen_analyzer/parse/value/
special.rs

1use std::str::FromStr;
2
3use nom::{bytes::complete::tag, sequence::preceded, IResult};
4
5use gen_utils::{
6    error::{ConvertError, Error},
7    parser::parse_closure_body,
8};
9
10pub enum Special {
11    MakepadShader,
12}
13
14impl Special {
15    /// return `(remain, (sign, (name, params, is_style)))`
16    pub fn makepad_shader_parser(input: &str) -> IResult<&str, (&str, (&str, &str, Option<bool>))> {
17        let (remain, body) = preceded(tag("shader"), parse_closure_body)(input)?;
18
19        Ok((remain, ("()", ("shader", body.trim(), Some(true)))))
20    }
21}
22
23impl FromStr for Special {
24    type Err = Error;
25
26    fn from_str(s: &str) -> Result<Self, Self::Err> {
27        match s {
28            "shader" => Ok(Special::MakepadShader),
29            _ => Err(ConvertError::FromTo {
30                from: s.to_string(),
31                to: "Fn Special".to_string(),
32            }
33            .into()),
34        }
35    }
36}