1use crate::fmt::Pretty;
2use crate::statement::{Statement, Statements};
3use crate::statements::{DefineStatement, RemoveStatement};
4use derive::Store;
5use revision::revisioned;
6use serde::{Deserialize, Serialize};
7use std::fmt::Write;
8use std::fmt::{self, Display, Formatter};
9use std::ops::Deref;
10use std::str;
11
12pub(crate) const TOKEN: &str = "$surrealdb::private::crate::Query";
13
14#[derive(Clone, Debug, Default, Eq, PartialEq, PartialOrd, Serialize, Deserialize, Store, Hash)]
15#[revisioned(revision = 1)]
16#[serde(rename = "$surrealdb::private::crate::Query")]
17pub struct Query(pub Statements);
18
19impl From<DefineStatement> for Query {
20 fn from(s: DefineStatement) -> Self {
21 Query(Statements(vec![Statement::Define(s)]))
22 }
23}
24
25impl From<RemoveStatement> for Query {
26 fn from(s: RemoveStatement) -> Self {
27 Query(Statements(vec![Statement::Remove(s)]))
28 }
29}
30
31impl Deref for Query {
32 type Target = Vec<Statement>;
33 fn deref(&self) -> &Self::Target {
34 &self.0 .0
35 }
36}
37
38impl IntoIterator for Query {
39 type Item = Statement;
40 type IntoIter = std::vec::IntoIter<Self::Item>;
41 fn into_iter(self) -> Self::IntoIter {
42 self.0.into_iter()
43 }
44}
45
46impl Display for Query {
47 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
48 write!(Pretty::from(f), "{}", &self.0)
49 }
50}