1pub 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;
20pub 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#[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;