use crate::commands::{from_op, TuringOp};
use anyhow::Result;
use serde::Serialize;
#[derive(Debug, Serialize, Clone)]
pub struct FieldQuery<T> {
db: String,
document: String,
field: String,
payload: Option<T>,
}
impl<T> FieldQuery<T>
where
T: serde::Serialize,
{
pub async fn new() -> Self {
Self {
db: Default::default(),
document: Default::default(),
field: Default::default(),
payload: Default::default(),
}
}
pub async fn db(&mut self, name: &str) -> &Self {
self.db = name.into();
self
}
pub async fn document(&mut self, name: &str) -> &Self {
self.document = name.into();
self
}
pub async fn field(&mut self, name: &str) -> &Self {
self.field = name.into();
self
}
pub async fn payload(&mut self, value: T) -> &Self {
self.payload = Some(value);
self
}
pub async fn set(&self) -> Result<Vec<u8>> {
let mut packet = from_op(&TuringOp::FieldInsert).to_vec();
packet.extend_from_slice(self.db.as_bytes());
let data = bincode::serialize::<Self>(self)?;
packet.extend_from_slice(&data);
Ok(packet)
}
pub async fn get(&self) -> Result<Vec<u8>> {
let mut packet = from_op(&TuringOp::FieldGet).to_vec();
packet.extend_from_slice(self.db.as_bytes());
let data = bincode::serialize::<Self>(self)?;
packet.extend_from_slice(&data);
Ok(packet)
}
pub fn list(&self) -> Result<Vec<u8>> {
let mut packet = from_op(&TuringOp::FieldList).to_vec();
packet.extend_from_slice(self.db.as_bytes());
let data = bincode::serialize::<Self>(self)?;
packet.extend_from_slice(&data);
Ok(packet)
}
pub fn remove(&self) -> Result<Vec<u8>> {
let mut packet = from_op(&TuringOp::FieldRemove).to_vec();
packet.extend_from_slice(self.db.as_bytes());
let data = bincode::serialize::<Self>(self)?;
packet.extend_from_slice(&data);
Ok(packet)
}
pub fn modify(&self) -> Result<Vec<u8>> {
let mut packet = from_op(&TuringOp::FieldModify).to_vec();
packet.extend_from_slice(self.db.as_bytes());
let data = bincode::serialize::<Self>(self)?;
packet.extend_from_slice(&data);
Ok(packet)
}
}