use ciborium::Value as CborValue;
use vantage_expressions::Expression;
use vantage_expressions::traits::expressive::ExpressiveEnum;
pub fn eq_condition(field: &str, value: impl Into<CborValue>) -> Expression<CborValue> {
Expression::new(
"{} = {}",
vec![
ExpressiveEnum::Nested(Expression::new(field.to_string(), vec![])),
ExpressiveEnum::Nested(Expression::new(
"{}",
vec![ExpressiveEnum::Scalar(value.into())],
)),
],
)
}
pub(crate) fn condition_to_query_param(cond: &Expression<CborValue>) -> Option<(String, String)> {
if cond.template != "{} = {}" || cond.parameters.len() != 2 {
return None;
}
let field = match &cond.parameters[0] {
ExpressiveEnum::Nested(e) if e.parameters.is_empty() => e.template.clone(),
_ => return None,
};
let value = match &cond.parameters[1] {
ExpressiveEnum::Nested(e) if e.template == "{}" && e.parameters.len() == 1 => {
match &e.parameters[0] {
ExpressiveEnum::Scalar(v) => cbor_to_query_string(v)?,
_ => return None,
}
}
ExpressiveEnum::Scalar(v) => cbor_to_query_string(v)?,
_ => return None,
};
Some((field, value))
}
pub(crate) fn cbor_to_query_string(v: &CborValue) -> Option<String> {
match v {
CborValue::Bool(b) => Some(b.to_string()),
CborValue::Integer(i) => Some(i128::from(*i).to_string()),
CborValue::Float(f) => Some(f.to_string()),
CborValue::Text(s) => Some(s.clone()),
CborValue::Null | CborValue::Array(_) | CborValue::Map(_) | CborValue::Bytes(_) => None,
_ => None,
}
}
pub(crate) fn placeholders(template: &str) -> impl Iterator<Item = &str> {
let mut rest = template;
std::iter::from_fn(move || {
let open = rest.find('{')?;
let after = &rest[open + 1..];
let close = after.find('}')?;
rest = &after[close + 1..];
Some(&after[..close])
})
}