ligen_python_parser/function/
parameter.rs

1use ligen::parser::ParserConfig;
2use rustpython_parser::ast::ArgWithDefault;
3use ligen::ir::Parameter;
4use crate::identifier::IdentifierParser;
5use crate::literal::LiteralParser;
6use crate::prelude::*;
7use crate::types::type_::TypeParser;
8
9#[derive(Default)]
10pub struct ParameterParser {
11    literal_parser: LiteralParser,
12}
13
14impl Parser<ArgWithDefault> for ParameterParser {
15    type Output = Parameter;
16    fn parse(&self, input: ArgWithDefault, config: &ParserConfig) -> Result<Self::Output> {
17        let attributes = Default::default();
18        let identifier = IdentifierParser::new().parse(input.def.arg.as_str(), config)?;
19        let type_ = if let Some(value) = input.def.annotation.and_then(|annotation| annotation.name_expr()) {
20            TypeParser::default().parse(&value, config)?
21        } else {
22            Default::default()
23        };
24        let default_value = if let Some(value) = input.default {
25            Some(self.literal_parser.parse(&*value, config)?)
26        } else {
27            None
28        };
29        Ok(Parameter { attributes, identifier, type_, default_value })
30    }
31}