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 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}