nom_kconfig/entry/
mod.rs

1//! Module defining the different Kconfig entries.
2//! Most entries define a config option; all other entries help to organize them. [https://www.kernel.org/doc/html/next/kbuild/kconfig-language.html#menu-entries](https://www.kernel.org/doc/html/next/kbuild/kconfig-language.html#menu-entries)
3
4use 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/// Official documentation about the different entries: [https://www.kernel.org/doc/html/next/kbuild/kconfig-language.html#menu-entries](https://www.kernel.org/doc/html/next/kbuild/kconfig-language.html#menu-entries)
41#[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;