use ankurah_proto::EntityId;
#[cfg_attr(feature = "uniffi", derive(uniffi::Enum))]
#[derive(Debug, Clone)]
pub enum QueryValue {
String(String),
Int(i64),
Float(f64),
Bool(bool),
EntityId(String),
}
impl TryFrom<QueryValue> for ankql::ast::Expr {
type Error = ankql::error::ParseError;
fn try_from(value: QueryValue) -> Result<Self, Self::Error> {
use ankql::ast::{Expr, Literal};
Ok(match value {
QueryValue::String(s) => Expr::Literal(Literal::String(s)),
QueryValue::Int(i) => Expr::Literal(Literal::I64(i)),
QueryValue::Float(f) => Expr::Literal(Literal::F64(f)),
QueryValue::Bool(b) => Expr::Literal(Literal::Bool(b)),
QueryValue::EntityId(s) => {
let id = EntityId::from_base64(&s)
.map_err(|e| ankql::error::ParseError::InvalidPredicate(format!("Invalid EntityId: {}", e)))?;
Expr::Literal(Literal::EntityId(id.to_ulid()))
}
})
}
}
impl From<String> for QueryValue {
fn from(s: String) -> Self { QueryValue::String(s) }
}
impl From<&str> for QueryValue {
fn from(s: &str) -> Self { QueryValue::String(s.to_string()) }
}
impl From<i64> for QueryValue {
fn from(i: i64) -> Self { QueryValue::Int(i) }
}
impl From<i32> for QueryValue {
fn from(i: i32) -> Self { QueryValue::Int(i as i64) }
}
impl From<f64> for QueryValue {
fn from(f: f64) -> Self { QueryValue::Float(f) }
}
impl From<bool> for QueryValue {
fn from(b: bool) -> Self { QueryValue::Bool(b) }
}
impl From<EntityId> for QueryValue {
fn from(id: EntityId) -> Self { QueryValue::EntityId(id.to_base64()) }
}