#[cfg(feature = "display")]
use std::fmt::Display;
use nom::{
bytes::complete::tag,
combinator::{map, opt},
IResult, Parser,
};
use super::expression::parse_expression;
use crate::{
attribute::{expression::parse_if_expression, Expression},
util::wsi,
KconfigInput,
};
#[cfg(feature = "deserialize")]
use serde::Deserialize;
#[cfg(feature = "serialize")]
use serde::Serialize;
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "hash", derive(Hash))]
#[cfg_attr(feature = "serialize", derive(Serialize))]
#[cfg_attr(feature = "deserialize", derive(Deserialize))]
pub struct DependsOn {
pub expression: Expression,
#[cfg_attr(
any(feature = "serialize", feature = "deserialize"),
serde(skip_serializing_if = "Option::is_none")
)]
pub r#if: Option<Expression>,
}
pub fn parse_depends_on(input: KconfigInput) -> IResult<KconfigInput, DependsOn> {
map(
(
tag("depends"),
wsi(opt(tag("on"))),
wsi(parse_expression),
opt(parse_if_expression),
),
|(_, _, e, r#if)| DependsOn {
expression: e,
r#if,
},
)
.parse(input)
}
#[cfg(feature = "display")]
impl Display for DependsOn {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match &self.r#if {
Some(i) => write!(f, "{} if {}", self.expression, i),
None => write!(f, "{}", self.expression),
}
}
}