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