nom_kconfig/entry/
variable.rs1use 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}