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    IResult, Parser,
8};
9#[cfg(feature = "deserialize")]
10use serde::Deserialize;
11#[cfg(feature = "serialize")]
12use serde::Serialize;
13
14use crate::{
15    attribute::function::{parse_expression_token_variable_parameter, ExpressionToken},
16    util::{parse_until_eol, ws},
17    KconfigInput,
18};
19
20#[derive(Debug, PartialEq, Clone)]
21#[cfg_attr(feature = "hash", derive(Hash))]
22#[cfg_attr(feature = "serialize", derive(Serialize))]
23#[cfg_attr(feature = "deserialize", derive(Deserialize))]
24pub struct VariableAssignment {
25    pub identifier: VariableIdentifier,
26    pub operator: String,
27    pub right: Value,
28}
29
30#[derive(Debug, PartialEq, Clone)]
31#[cfg_attr(feature = "hash", derive(Hash))]
32#[cfg_attr(feature = "serialize", derive(Serialize))]
33#[cfg_attr(feature = "deserialize", derive(Deserialize))]
34pub enum VariableIdentifier {
35    Identifier(String),
36    VariableRef(Vec<ExpressionToken>),
37}
38
39#[derive(Debug, PartialEq, Clone)]
40#[cfg_attr(feature = "hash", derive(Hash))]
41#[cfg_attr(feature = "serialize", derive(Serialize))]
42#[cfg_attr(feature = "deserialize", derive(Deserialize))]
43pub enum Value {
44    Literal(String),
45    ExpandedVariable(String),
46}
47
48pub fn parse_value(input: KconfigInput) -> IResult<KconfigInput, Value> {
49    map(parse_until_eol, |d| {
50        Value::Literal(d.fragment().trim().to_string())
51    })
52    .parse(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    ))
65    .parse(input)
66}
67
68pub fn parse_variable_assignment(input: KconfigInput) -> IResult<KconfigInput, VariableAssignment> {
69    map(
70        (
71            ws(parse_variable_identifier),
72            ws(parse_assign),
73            ws(parse_value),
74        ),
75        |(l, o, r)| VariableAssignment {
76            identifier: l,
77            operator: o.to_string(),
78            right: r,
79        },
80    )
81    .parse(input)
82}
83
84pub fn parse_assign(input: KconfigInput<'_>) -> IResult<KconfigInput<'_>, &str> {
85    map(alt((tag("="), tag(":="), tag("+="))), |d: KconfigInput| {
86        d.fragment().to_owned()
87    })
88    .parse(input)
89}