1use nom::{branch::alt, combinator::map, multi::many0, sequence::delimited, IResult, Parser};
5#[cfg(feature = "deserialize")]
6use serde::Deserialize;
7#[cfg(feature = "serialize")]
8use serde::Serialize;
9
10use crate::{
11 attribute::function::{parse_function_call, FunctionCall},
12 util::{ws, ws_comment},
13 KconfigInput,
14};
15
16pub use self::{
17 choice::{parse_choice, Choice},
18 comment::{parse_comment, Comment},
19 config::{parse_config, Config},
20 function::{parse_function, Function},
21 main_menu::{parse_main_menu, MainMenu},
22 menu::{parse_menu, Menu},
23 menuconfig::{parse_menu_config, MenuConfig},
24 r#if::{parse_if, If},
25 source::{parse_source, Source},
26 variable::{parse_variable_assignment, Value, VariableAssignment, VariableIdentifier},
27};
28
29pub mod choice;
30pub mod comment;
31pub mod config;
32pub mod function;
33pub mod r#if;
34pub mod main_menu;
35pub mod menu;
36pub mod menuconfig;
37pub mod source;
38pub mod variable;
39
40#[derive(Debug, Clone, PartialEq)]
42#[cfg_attr(feature = "hash", derive(Hash))]
43#[cfg_attr(feature = "serialize", derive(Serialize))]
44#[cfg_attr(feature = "deserialize", derive(Deserialize))]
45pub enum Entry {
46 Config(Config),
47 Choice(Choice),
48 MenuConfig(MenuConfig),
49 Menu(Menu),
50 Comment(Comment),
51 Source(Source),
52 VariableAssignment(VariableAssignment),
53 FunctionCall(FunctionCall),
54 Function(Function),
55 If(If),
56 MainMenu(MainMenu),
57}
58
59pub fn parse_entry(input: KconfigInput) -> IResult<KconfigInput, Entry> {
60 alt((
61 map(ws(parse_config), Entry::Config),
62 map(ws(parse_choice), Entry::Choice),
63 map(ws(parse_menu_config), Entry::MenuConfig),
64 map(ws(parse_function), Entry::Function),
65 map(ws(parse_main_menu), Entry::MainMenu),
66 map(ws(parse_if), Entry::If),
67 map(ws(parse_menu), Entry::Menu),
68 map(ws(parse_comment), Entry::Comment),
69 map(ws(parse_source), Entry::Source),
70 map(ws(parse_variable_assignment), Entry::VariableAssignment),
71 map(ws(parse_function_call), Entry::FunctionCall),
72 ))
73 .parse(input)
74}
75
76pub fn parse_entries(input: KconfigInput) -> IResult<KconfigInput, Vec<Entry>> {
77 delimited(ws_comment, many0(parse_entry), ws_comment).parse(input)
78}
79
80#[cfg(test)]
81pub mod mod_test;
82
83#[cfg(test)]
84pub mod choice_test;
85#[cfg(test)]
86mod comment_test;
87#[cfg(test)]
88mod config_test;
89#[cfg(test)]
90mod function_test;
91#[cfg(test)]
92pub mod if_test;
93#[cfg(test)]
94mod main_menu_test;
95#[cfg(test)]
96mod menu_test;
97#[cfg(test)]
98mod menuconfig_test;
99#[cfg(test)]
100mod source_test;
101#[cfg(test)]
102mod variable_test;