nom_kconfig/attribute/expression/
term.rs

1use crate::attribute::expression::parse_atom;
2use crate::attribute::Atom;
3use crate::util::wsi;
4use crate::KconfigInput;
5use nom::branch::alt;
6use nom::bytes::complete::tag;
7use nom::combinator::map;
8use nom::sequence::preceded;
9use nom::{IResult, Parser};
10#[cfg(feature = "deserialize")]
11use serde::Deserialize;
12#[cfg(feature = "serialize")]
13use serde::Serialize;
14#[cfg(feature = "display")]
15use std::fmt::Display;
16
17#[derive(Debug, PartialEq, Clone)]
18#[cfg_attr(feature = "hash", derive(Hash))]
19#[cfg_attr(feature = "serialize", derive(Serialize))]
20#[cfg_attr(feature = "deserialize", derive(Deserialize))]
21pub enum Term {
22    Not(Atom),
23    Atom(Atom),
24}
25
26#[cfg(feature = "display")]
27impl Display for Term {
28    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
29        match self {
30            Term::Not(atom) => write!(f, "!{}", atom),
31            Term::Atom(atom) => write!(f, "{}", atom),
32        }
33    }
34}
35
36pub fn parse_term(input: KconfigInput) -> IResult<KconfigInput, Term> {
37    alt((
38        map(preceded(wsi(tag("!")), parse_atom), Term::Not),
39        map(parse_atom, Term::Atom),
40    ))
41    .parse(input)
42}