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