use ciborium::Value as CborValue;
use vantage_expressions::Expressive;
use crate::condition::AwsCondition;
fn field_name<T>(expr: &(impl Expressive<T> + ?Sized)) -> String {
expr.expr().template
}
pub trait AwsOperation<T>: Expressive<T> {
fn eq(&self, value: impl Into<CborValue>) -> AwsCondition
where
Self: Sized,
{
AwsCondition::eq(field_name(self), value)
}
fn in_<E>(&self, source: E) -> AwsCondition
where
Self: Sized,
E: Expressive<CborValue>,
{
AwsCondition::Deferred {
field: field_name(self),
source: source.expr(),
}
}
}
impl<T, S: Expressive<T>> AwsOperation<T> for S {}
#[cfg(test)]
mod tests {
use super::*;
use vantage_expressions::Expression;
use vantage_table::column::core::Column;
#[test]
fn column_eq_produces_aws_condition() {
let c = Column::<String>::new("logGroupName");
match c.eq("/aws/lambda/foo") {
AwsCondition::Eq { field, value } => {
assert_eq!(field, "logGroupName");
assert!(matches!(value, CborValue::Text(ref s) if s == "/aws/lambda/foo"));
}
other => panic!("expected Eq, got {other:?}"),
}
}
#[test]
fn column_in_produces_deferred() {
let c = Column::<String>::new("logGroupName");
let source: Expression<CborValue> = Expression::new("subquery", vec![]);
match c.in_(source) {
AwsCondition::Deferred { field, source } => {
assert_eq!(field, "logGroupName");
assert_eq!(source.template, "subquery");
}
other => panic!("expected Deferred, got {other:?}"),
}
}
}