Skip to main content

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
10#[cfg(feature = "kconfiglib")]
11use crate::entry::configdefault::{parse_configdefault, ConfigDefault};
12
13use crate::{
14    attribute::function::{parse_function_call, FunctionCall},
15    util::{ws, ws_comment},
16    KconfigInput,
17};
18
19pub use self::{
20    choice::{parse_choice, Choice},
21    comment::{parse_comment, Comment},
22    config::{parse_config, Config},
23    function::{parse_function, Function},
24    main_menu::{parse_main_menu, MainMenu},
25    menu::{parse_menu, Menu},
26    menuconfig::{parse_menu_config, MenuConfig},
27    r#if::{parse_if, If},
28    source::{parse_source, Source},
29    variable::{parse_variable_assignment, Value, VariableAssignment, VariableIdentifier},
30};
31
32#[cfg(feature = "kconfiglib")]
33use crate::entry::source::{
34    parse_orsource, parse_osource, parse_rsource, OSource, OrSource, RSource,
35};
36
37pub mod choice;
38pub mod comment;
39pub mod config;
40#[cfg(feature = "kconfiglib")]
41pub mod configdefault;
42pub mod function;
43pub mod r#if;
44pub mod main_menu;
45pub mod menu;
46pub mod menuconfig;
47pub mod source;
48pub mod variable;
49
50/// 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)
51#[derive(Debug, Clone, PartialEq)]
52#[cfg_attr(feature = "hash", derive(Hash))]
53#[cfg_attr(feature = "serialize", derive(Serialize))]
54#[cfg_attr(feature = "deserialize", derive(Deserialize))]
55pub enum Entry {
56    Config(Config),
57    Choice(Choice),
58    MenuConfig(MenuConfig),
59    Menu(Menu),
60    Comment(Comment),
61    Source(Source),
62    VariableAssignment(VariableAssignment),
63    FunctionCall(FunctionCall),
64    Function(Function),
65    If(If),
66    MainMenu(MainMenu),
67    #[cfg(feature = "kconfiglib")]
68    ConfigDefault(ConfigDefault),
69    #[cfg(feature = "kconfiglib")]
70    OSource(OSource),
71    #[cfg(feature = "kconfiglib")]
72    RSource(RSource),
73    #[cfg(feature = "kconfiglib")]
74    OrSource(OrSource),
75}
76
77pub fn parse_entry(input: KconfigInput) -> IResult<KconfigInput, Entry> {
78    alt((
79        #[cfg(feature = "kconfiglib")]
80        // Order matters here (configdefault must be parsed before config)
81        map(ws(parse_configdefault), Entry::ConfigDefault),
82        map(ws(parse_config), Entry::Config),
83        map(ws(parse_choice), Entry::Choice),
84        map(ws(parse_menu_config), Entry::MenuConfig),
85        //map(ws(parse_function), Entry::Function),
86        map(ws(parse_main_menu), Entry::MainMenu),
87        map(ws(parse_if), Entry::If),
88        map(ws(parse_menu), Entry::Menu),
89        map(ws(parse_comment), Entry::Comment),
90        map(ws(parse_source), Entry::Source),
91        #[cfg(feature = "kconfiglib")]
92        map(ws(parse_osource), Entry::OSource),
93        #[cfg(feature = "kconfiglib")]
94        map(ws(parse_rsource), Entry::RSource),
95        #[cfg(feature = "kconfiglib")]
96        map(ws(parse_orsource), Entry::OrSource),
97        map(ws(parse_variable_assignment), Entry::VariableAssignment),
98        map(ws(parse_function_call), Entry::FunctionCall),
99    ))
100    .parse(input)
101}
102
103pub fn parse_entries(input: KconfigInput) -> IResult<KconfigInput, Vec<Entry>> {
104    delimited(ws_comment, many0(parse_entry), ws_comment).parse(input)
105}
106
107#[cfg(test)]
108pub mod mod_test;
109
110#[cfg(test)]
111pub mod choice_test;
112#[cfg(test)]
113mod comment_test;
114#[cfg(test)]
115mod config_test;
116#[cfg(test)]
117mod function_test;
118#[cfg(test)]
119pub mod if_test;
120#[cfg(test)]
121mod main_menu_test;
122#[cfg(test)]
123mod menu_test;
124#[cfg(test)]
125mod menuconfig_test;
126#[cfg(test)]
127mod variable_test;
128
129#[cfg(test)]
130#[cfg(feature = "kconfiglib")]
131mod configdefault_test;