use crate::dbs::Executor; use crate::dbs::Options; use crate::dbs::Runtime; use crate::err::Error; use crate::sql::comment::shouldbespace; use crate::sql::cond::{cond, Cond}; use crate::sql::error::IResult; use crate::sql::fetch::{fetch, Fetchs}; use crate::sql::field::{fields, Fields}; use crate::sql::value::Value; use crate::sql::value::{whats, Values}; use nom::bytes::complete::tag_no_case; use nom::combinator::opt; use nom::sequence::preceded; use serde::{Deserialize, Serialize}; use std::fmt; #[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] pub struct LiveStatement { pub expr: Fields, pub what: Values, #[serde(skip_serializing_if = "Option::is_none")] pub cond: Option<Cond>, #[serde(skip_serializing_if = "Option::is_none")] pub fetch: Option<Fetchs>, } impl LiveStatement { pub async fn compute( &self, _ctx: &Runtime, _opt: &Options<'_>, _exe: &mut Executor, _doc: Option<&Value>, ) -> Result<Value, Error> { todo!() } } impl fmt::Display for LiveStatement { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "LIVE SELECT {} FROM {}", self.expr, self.what)?; if let Some(ref v) = self.cond { write!(f, " {}", v)? } if let Some(ref v) = self.fetch { write!(f, " {}", v)? } Ok(()) } } pub fn live(i: &str) -> IResult<&str, LiveStatement> { let (i, _) = tag_no_case("LIVE SELECT")(i)?; let (i, _) = shouldbespace(i)?; let (i, expr) = fields(i)?; let (i, _) = shouldbespace(i)?; let (i, _) = tag_no_case("FROM")(i)?; let (i, _) = shouldbespace(i)?; let (i, what) = whats(i)?; let (i, cond) = opt(preceded(shouldbespace, cond))(i)?; let (i, fetch) = opt(preceded(shouldbespace, fetch))(i)?; Ok(( i, LiveStatement { expr, what, cond, fetch, }, )) }