nom_kconfig/attribute/expression/
compare.rs1use 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}