nom_kconfig/attribute/
mod.rs

1//! Module defining the different attributes.
2//! A entry can have a number of attributes: [https://www.kernel.org/doc/html/next/kbuild/kconfig-language.html#menu-attributes](https://www.kernel.org/doc/html/next/kbuild/kconfig-language.html#menu-attributes)
3
4pub mod default;
5pub mod depends_on;
6pub mod function;
7pub mod help;
8pub mod imply;
9pub mod modules;
10pub mod option;
11pub mod optional;
12pub mod prompt;
13pub mod range;
14pub mod requires;
15pub mod select;
16pub mod string;
17pub mod transitional;
18pub mod r#type;
19pub mod visible;
20//pub mod expressiondd;
21pub mod expression;
22
23use nom::{branch::alt, combinator::map, multi::many0, IResult, Parser};
24#[cfg(feature = "deserialize")]
25use serde::Deserialize;
26#[cfg(feature = "serialize")]
27use serde::Serialize;
28
29use crate::{attribute::transitional::parse_transitional, util::ws, KconfigInput};
30
31use self::r#type::ConfigType;
32pub use self::{
33    default::{parse_default, DefaultAttribute},
34    depends_on::parse_depends_on,
35    expression::Expression,
36    help::parse_help,
37    imply::{parse_imply, Imply},
38    modules::parse_modules,
39    option::{parse_option, OptionValues},
40    prompt::{parse_prompt, Prompt},
41    range::{parse_range, Range},
42    requires::parse_requires,
43    select::{parse_select, Select},
44    visible::parse_visible,
45};
46
47pub use self::expression::{
48    parse_expression, parse_if_attribute, AndExpression, Atom, CompareExpression, CompareOperator,
49    OrExpression, Term,
50};
51pub use self::function::{parse_function_call, ExpressionToken, FunctionCall, Parameter};
52pub use self::optional::parse_optional;
53pub use self::prompt::parse_prompt_value;
54
55/// Official documentation regarding the different attributes: [https://www.kernel.org/doc/html/next/kbuild/kconfig-language.html#menu-attributes](https://www.kernel.org/doc/html/next/kbuild/kconfig-language.html#menu-attributes)
56#[derive(Debug, Clone, PartialEq)]
57#[cfg_attr(feature = "hash", derive(Hash))]
58#[cfg_attr(feature = "serialize", derive(Serialize))]
59#[cfg_attr(feature = "deserialize", derive(Deserialize))]
60pub enum Attribute {
61    Help(String),
62    Prompt(Prompt),
63    Modules,
64    Select(Select),
65    DependsOn(Expression),
66    Optional,
67    Range(Range),
68    Visible(Option<Expression>),
69    Default(DefaultAttribute),
70    Imply(Imply),
71    Requires(Expression),
72    Type(ConfigType),
73    Option(OptionValues),
74    Transitional,
75}
76
77pub fn parse_attributes(input: KconfigInput) -> IResult<KconfigInput, Vec<Attribute>> {
78    ws(many0(parse_attribute)).parse(input)
79}
80
81pub fn parse_attribute(input: KconfigInput) -> IResult<KconfigInput, Attribute> {
82    alt((
83        map(ws(parse_prompt), Attribute::Prompt),
84        map(ws(parse_help), Attribute::Help),
85        ws(parse_depends_on),
86        map(ws(parse_select), Attribute::Select),
87        map(ws(parse_default), Attribute::Default),
88        map(ws(parse_requires), Attribute::Requires),
89        map(ws(parse_modules), |_| Attribute::Modules),
90        map(ws(parse_range), Attribute::Range),
91        map(ws(parse_imply), Attribute::Imply),
92        map(ws(parse_visible), Attribute::Visible),
93        map(ws(parse_option), Attribute::Option),
94        map(ws(parse_optional), |_| Attribute::Optional),
95        map(ws(parse_transitional), |_| Attribute::Transitional),
96    ))
97    .parse(input)
98}
99
100#[cfg(feature = "display")]
101use std::fmt::Display;
102#[cfg(feature = "display")]
103impl Display for Attribute {
104    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
105        match self {
106            Attribute::Help(s) => write!(f, "help\n  {}", s),
107            Attribute::Prompt(p) => write!(f, "prompt {p}"),
108            Attribute::Modules => write!(f, "modules"),
109            Attribute::Select(s) => write!(f, "select {s}"),
110            Attribute::DependsOn(d) => write!(f, "depends on {d}"),
111            Attribute::Optional => write!(f, "optional"),
112            Attribute::Range(r) => write!(f, "range {r}"),
113            Attribute::Visible(v) => match v {
114                Some(e) => write!(f, "visible if {e}"),
115                None => write!(f, "visible"),
116            },
117            Attribute::Default(d) => write!(f, "default {d}"),
118            Attribute::Imply(i) => write!(f, "imply {i}"),
119            Attribute::Requires(r) => write!(f, "requires {r}"),
120            Attribute::Type(t) => write!(f, "{t}"),
121            Attribute::Option(o) => write!(f, "option {o}"),
122            Attribute::Transitional => write!(f, "transitional"),
123        }
124    }
125}
126
127#[cfg(test)]
128mod default_test;
129#[cfg(test)]
130mod depends_on_test;
131#[cfg(test)]
132mod function_test;
133#[cfg(test)]
134mod help_test;
135#[cfg(test)]
136mod imply_test;
137#[cfg(test)]
138mod mod_test;
139#[cfg(test)]
140mod modules_test;
141#[cfg(test)]
142mod option_test;
143#[cfg(test)]
144mod optional_test;
145#[cfg(test)]
146mod prompt_test;
147#[cfg(test)]
148mod range_test;
149#[cfg(test)]
150mod requires_test;
151#[cfg(test)]
152mod select_test;
153#[cfg(test)]
154mod transitional_test;
155#[cfg(test)]
156mod type_test;
157#[cfg(test)]
158mod visible_test;