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