nom_kconfig/entry/
function.rs

1use nom::{
2    branch::alt,
3    bytes::complete::tag,
4    character::complete::{alphanumeric1, line_ending, not_line_ending, one_of},
5    combinator::{map, recognize},
6    multi::many1,
7    sequence::terminated,
8    IResult, Parser,
9};
10#[cfg(feature = "deserialize")]
11use serde::Deserialize;
12#[cfg(feature = "serialize")]
13use serde::Serialize;
14
15use crate::{util::ws, KconfigInput};
16
17#[derive(Debug, PartialEq, Clone, Default)]
18#[cfg_attr(feature = "hash", derive(Hash))]
19#[cfg_attr(feature = "serialize", derive(Serialize))]
20#[cfg_attr(feature = "deserialize", derive(Deserialize))]
21pub struct Function {
22    pub name: String,
23    pub body: String,
24}
25
26pub fn parse_function(input: KconfigInput) -> IResult<KconfigInput, Function> {
27    map(
28        (
29            recognize(ws(many1(alt((
30                alphanumeric1::<KconfigInput, _>,
31                recognize(one_of("_$()")),
32            ))))),
33            ws(tag("=")),
34            ws(terminated(not_line_ending, line_ending)),
35        ),
36        |(l, _, o)| Function {
37            name: l.trim().to_string(),
38            body: o.to_string(),
39        },
40    )
41    .parse(input)
42}