use ciborium::Value as CborValue;
use vantage_expressions::Expression;
#[derive(Clone)]
pub enum CmdCondition {
Eq { field: String, value: CborValue },
In {
field: String,
values: Vec<CborValue>,
},
Deferred {
field: String,
source: Expression<CborValue>,
},
}
impl std::fmt::Debug for CmdCondition {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Eq { field, value } => f
.debug_struct("Eq")
.field("field", field)
.field("value", value)
.finish(),
Self::In { field, values } => f
.debug_struct("In")
.field("field", field)
.field("values", values)
.finish(),
Self::Deferred { field, source } => f
.debug_struct("Deferred")
.field("field", field)
.field("source.template", &source.template)
.finish(),
}
}
}
impl CmdCondition {
pub fn eq(field: impl Into<String>, value: impl Into<CborValue>) -> Self {
Self::Eq {
field: field.into(),
value: value.into(),
}
}
pub fn in_<I, V>(field: impl Into<String>, values: I) -> Self
where
I: IntoIterator<Item = V>,
V: Into<CborValue>,
{
Self::In {
field: field.into(),
values: values.into_iter().map(Into::into).collect(),
}
}
pub fn field(&self) -> &str {
match self {
Self::Eq { field, .. } | Self::In { field, .. } | Self::Deferred { field, .. } => field,
}
}
pub(crate) fn op(&self) -> &'static str {
match self {
Self::Eq { .. } => "eq",
Self::In { .. } => "in",
Self::Deferred { .. } => "eq",
}
}
pub(crate) fn json_value(&self) -> serde_json::Value {
match self {
Self::Eq { value, .. } => crate::types::cbor_to_json(value),
Self::In { values, .. } => {
serde_json::Value::Array(values.iter().map(crate::types::cbor_to_json).collect())
}
Self::Deferred { .. } => serde_json::Value::Null,
}
}
}
pub fn eq(field: impl Into<String>, value: impl Into<CborValue>) -> CmdCondition {
CmdCondition::eq(field, value)
}