nom_kconfig/entry/
variable.rs

1use nom::{
2    branch::alt,
3    bytes::complete::tag,
4    character::complete::{alphanumeric1, one_of},
5    combinator::{map, recognize},
6    multi::many1,
7    sequence::tuple,
8    IResult,
9};
10#[cfg(feature = "deserialize")]
11use serde::Deserialize;
12#[cfg(feature = "serialize")]
13use serde::Serialize;
14
15use crate::{
16    attribute::function::{parse_expression_token_variable_parameter, ExpressionToken},
17    util::{parse_until_eol, ws},
18    KconfigInput,
19};
20
21#[derive(Debug, PartialEq, Clone)]
22#[cfg_attr(feature = "hash", derive(Hash))]
23#[cfg_attr(feature = "serialize", derive(Serialize))]
24#[cfg_attr(feature = "deserialize", derive(Deserialize))]
25pub struct VariableAssignment {
26    pub identifier: VariableIdentifier,
27    pub operator: String,
28    pub right: Value,
29}
30
31#[derive(Debug, PartialEq, Clone)]
32#[cfg_attr(feature = "hash", derive(Hash))]
33#[cfg_attr(feature = "serialize", derive(Serialize))]
34#[cfg_attr(feature = "deserialize", derive(Deserialize))]
35pub enum VariableIdentifier {
36    Identifier(String),
37    VariableRef(Vec<ExpressionToken>),
38}
39
40#[derive(Debug, PartialEq, Clone)]
41#[cfg_attr(feature = "hash", derive(Hash))]
42#[cfg_attr(feature = "serialize", derive(Serialize))]
43#[cfg_attr(feature = "deserialize", derive(Deserialize))]
44pub enum Value {
45    Literal(String),
46    ExpandedVariable(String),
47}
48
49pub fn parse_value(input: KconfigInput) -> IResult<KconfigInput, Value> {
50    map(parse_until_eol, |d| {
51        Value::Literal(d.fragment().trim().to_string())
52    })(input)
53}
54
55pub fn parse_variable_identifier(input: KconfigInput) -> IResult<KconfigInput, VariableIdentifier> {
56    alt((
57        map(
58            recognize(ws(many1(alt((alphanumeric1, recognize(one_of("-_"))))))),
59            |l: KconfigInput| VariableIdentifier::Identifier(l.trim().to_string()),
60        ),
61        map(many1(parse_expression_token_variable_parameter), |v| {
62            VariableIdentifier::VariableRef(v)
63        }),
64    ))(input)
65}
66
67pub fn parse_variable_assignment(input: KconfigInput) -> IResult<KconfigInput, VariableAssignment> {
68    map(
69        tuple((
70            ws(parse_variable_identifier),
71            ws(parse_assign),
72            ws(parse_value),
73        )),
74        |(l, o, r)| VariableAssignment {
75            identifier: l,
76            operator: o.to_string(),
77            right: r,
78        },
79    )(input)
80}
81
82pub fn parse_assign(input: KconfigInput) -> IResult<KconfigInput, &str> {
83    map(alt((tag("="), tag(":="), tag("+="))), |d: KconfigInput| {
84        d.fragment().to_owned()
85    })(input)
86}