1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use nom::{
    branch::alt,
    bytes::complete::tag,
    character::complete::{alphanumeric1, line_ending, not_line_ending, one_of},
    combinator::{map, recognize},
    multi::many1,
    sequence::{terminated, tuple},
    IResult,
};
#[cfg(feature = "deserialize")]
use serde::Deserialize;
#[cfg(feature = "serialize")]
use serde::Serialize;

use crate::{util::ws, KconfigInput};

#[derive(Debug, PartialEq, Clone, Default)]
#[cfg_attr(feature = "hash", derive(Hash))]
#[cfg_attr(feature = "serialize", derive(Serialize))]
#[cfg_attr(feature = "deserialize", derive(Deserialize))]
pub struct Function {
    pub name: String,
    pub body: String,
}

pub fn parse_function(input: KconfigInput) -> IResult<KconfigInput, Function> {
    map(
        tuple((
            recognize(ws(many1(alt((
                alphanumeric1::<KconfigInput, _>,
                recognize(one_of("_$()")),
            ))))),
            ws(tag("=")),
            ws(terminated(not_line_ending, line_ending)),
        )),
        |(l, _, o)| Function {
            name: l.trim().to_string(),
            body: o.to_string(),
        },
    )(input)
}