Skip to main content

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