nom_kconfig/attribute/expression/
compare.rs

1use crate::attribute::Atom;
2use crate::symbol::parse_symbol;
3use crate::util::wsi;
4use crate::{KconfigInput, Symbol};
5use nom::branch::alt;
6use nom::bytes::complete::tag;
7use nom::combinator::{map, value};
8use nom::{IResult, Parser};
9#[cfg(feature = "deserialize")]
10use serde::Deserialize;
11#[cfg(feature = "serialize")]
12use serde::Serialize;
13#[cfg(feature = "display")]
14use std::fmt::Display;
15
16#[derive(Debug, PartialEq, Clone)]
17#[cfg_attr(feature = "hash", derive(Hash))]
18#[cfg_attr(feature = "serialize", derive(Serialize))]
19#[cfg_attr(feature = "deserialize", derive(Deserialize))]
20pub enum CompareOperator {
21    GreaterThan,
22    GreaterOrEqual,
23    LowerThan,
24    LowerOrEqual,
25    Equal,
26    NotEqual,
27}
28
29#[derive(Debug, PartialEq, Clone)]
30#[cfg_attr(feature = "hash", derive(Hash))]
31#[cfg_attr(feature = "serialize", derive(Serialize))]
32#[cfg_attr(feature = "deserialize", derive(Deserialize))]
33#[cfg_attr(feature = "serialize", serde(rename = "Compare"))]
34pub struct CompareExpression {
35    pub left: Symbol,
36    pub operator: CompareOperator,
37    pub right: Symbol,
38}
39
40#[cfg(feature = "display")]
41impl Display for CompareExpression {
42    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
43        write!(f, "{} {} {}", self.left, self.operator, self.right)
44    }
45}
46
47#[cfg(feature = "display")]
48impl Display for CompareOperator {
49    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
50        match self {
51            CompareOperator::GreaterThan => write!(f, ">"),
52            CompareOperator::GreaterOrEqual => write!(f, ">="),
53            CompareOperator::LowerThan => write!(f, "<"),
54            CompareOperator::LowerOrEqual => write!(f, "<="),
55            CompareOperator::Equal => write!(f, "="),
56            CompareOperator::NotEqual => write!(f, "!="),
57        }
58    }
59}
60
61pub fn parse_compare_operator(input: KconfigInput) -> IResult<KconfigInput, CompareOperator> {
62    alt((
63        value(CompareOperator::GreaterOrEqual, tag(">=")),
64        value(CompareOperator::LowerOrEqual, tag("<=")),
65        value(CompareOperator::GreaterThan, tag(">")),
66        value(CompareOperator::LowerThan, tag("<")),
67        value(CompareOperator::Equal, tag("=")),
68        value(CompareOperator::NotEqual, tag("!=")),
69    ))
70    .parse(input)
71}
72
73pub fn parse_compare(input: KconfigInput) -> IResult<KconfigInput, Atom> {
74    map(
75        (
76            wsi(parse_symbol),
77            wsi(parse_compare_operator),
78            wsi(parse_symbol),
79        ),
80        |(l, o, r)| {
81            Atom::Compare(CompareExpression {
82                left: l,
83                operator: o,
84                right: r,
85            })
86        },
87    )
88    .parse(input)
89}