1use crate::{escape::escape_ident, fmt::Fmt, strand::no_nul_bytes, Id, Ident, Thing};
2use revision::revisioned;
3use serde::{Deserialize, Serialize};
4use std::fmt::{self, Display, Formatter};
5use std::ops::Deref;
6use std::str;
7
8pub(crate) const TOKEN: &str = "$surrealdb::private::crate::Table";
9
10#[derive(Clone, Debug, Default, Eq, PartialEq, PartialOrd, Serialize, Deserialize, Hash)]
11#[revisioned(revision = 1)]
12pub struct Tables(pub Vec<Table>);
13
14impl From<Table> for Tables {
15 fn from(v: Table) -> Self {
16 Tables(vec![v])
17 }
18}
19
20impl Deref for Tables {
21 type Target = Vec<Table>;
22 fn deref(&self) -> &Self::Target {
23 &self.0
24 }
25}
26
27impl Display for Tables {
28 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
29 Display::fmt(&Fmt::comma_separated(&self.0), f)
30 }
31}
32
33#[derive(Clone, Debug, Default, Eq, PartialEq, PartialOrd, Serialize, Deserialize, Hash)]
34#[serde(rename = "$surrealdb::private::crate::Table")]
35#[revisioned(revision = 1)]
36pub struct Table(#[serde(with = "no_nul_bytes")] pub String);
37
38impl From<String> for Table {
39 fn from(v: String) -> Self {
40 Self(v)
41 }
42}
43
44impl From<&str> for Table {
45 fn from(v: &str) -> Self {
46 Self::from(String::from(v))
47 }
48}
49
50impl From<Ident> for Table {
51 fn from(v: Ident) -> Self {
52 Self(v.0)
53 }
54}
55
56impl Deref for Table {
57 type Target = String;
58 fn deref(&self) -> &Self::Target {
59 &self.0
60 }
61}
62
63impl Table {
64 pub fn generate(&self) -> Thing {
65 Thing {
66 tb: self.0.to_owned(),
67 id: Id::rand(),
68 }
69 }
70}
71
72impl Display for Table {
73 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
74 Display::fmt(&escape_ident(&self.0), f)
75 }
76}