use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SortDirection {
Asc,
Desc,
}
#[derive(Debug, Clone)]
pub enum IntPredicate {
Equals(i64),
GreaterThan(i64),
GreaterThanOrEqual(i64),
LessThan(i64),
LessThanOrEqual(i64),
}
#[derive(Debug, Clone)]
pub enum StringPredicate {
Equals(String),
Contains(String),
StartsWith(String),
EndsWith(String),
}
#[derive(Debug, Clone)]
pub enum DateTimePredicate {
Equals(chrono::DateTime<chrono::Utc>),
After(chrono::DateTime<chrono::Utc>),
Before(chrono::DateTime<chrono::Utc>),
}
#[derive(Debug, Clone)]
pub enum RecordPredicate {
Equals(crate::RecordId),
}
#[derive(Debug, Clone, Copy)]
pub enum NullPredicate {
IsNone,
IsSome,
}
#[derive(Debug, Clone)]
pub struct OrderBy {
pub field: String,
pub direction: SortDirection,
}
#[derive(Debug, Clone, Serialize)]
pub struct IdOnlyRecord {
pub id: String,
}
impl<'de> Deserialize<'de> for IdOnlyRecord {
fn deserialize<D: serde::Deserializer<'de>>(
deserializer: D,
) -> std::result::Result<Self, D::Error> {
use serde::de::Error;
use serde_json::Value;
let value = Value::deserialize(deserializer)?;
let id = match value {
Value::String(s) => crate::row_json::thing_to_id_only(s),
Value::Object(map) => match map.get("id") {
Some(Value::String(s)) => crate::row_json::thing_to_id_only(s.clone()),
Some(Value::Object(inner)) => inner
.get("id")
.and_then(|v| v.as_str())
.map(str::to_string)
.ok_or_else(|| D::Error::custom("IdOnlyRecord.id object missing string id"))?,
Some(other) => {
return Err(D::Error::custom(format!(
"IdOnlyRecord.id expected string or {{table,id}} object, got {other}"
)));
}
None => {
return Err(D::Error::custom("IdOnlyRecord missing id field"));
}
},
other => {
return Err(D::Error::custom(format!(
"IdOnlyRecord expected string or object, got {other}"
)));
}
};
Ok(IdOnlyRecord { id })
}
}