ligen_python_parser/function/
parameter.rs1use 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}