surql_parser/upstream/sql/statements/define/
field.rs1use super::DefineKind;
2use crate::upstream::fmt::CoverStmts;
3use crate::upstream::sql::reference::Reference;
4use crate::upstream::sql::{Expr, Kind, Literal, Permissions};
5use surrealdb_types::{SqlFormat, ToSql, write_sql};
6#[derive(Clone, Debug, Default, PartialEq, Eq)]
7#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
8pub enum DefineDefault {
9 #[default]
10 None,
11 Always(Expr),
12 Set(Expr),
13}
14#[derive(Clone, Debug, PartialEq, Eq)]
15pub struct DefineFieldStatement {
16 pub kind: DefineKind,
17 pub name: Expr,
18 pub what: Expr,
19 pub field_kind: Option<Kind>,
20 pub flexible: bool,
21 pub readonly: bool,
22 pub value: Option<Expr>,
23 pub assert: Option<Expr>,
24 pub computed: Option<Expr>,
25 pub default: DefineDefault,
26 pub permissions: Permissions,
27 pub comment: Expr,
28 pub reference: Option<Reference>,
29}
30impl Default for DefineFieldStatement {
31 fn default() -> Self {
32 Self {
33 kind: DefineKind::Default,
34 name: Expr::Literal(Literal::None),
35 what: Expr::Literal(Literal::None),
36 field_kind: None,
37 flexible: false,
38 readonly: false,
39 value: None,
40 assert: None,
41 computed: None,
42 default: DefineDefault::None,
43 permissions: Permissions::default(),
44 comment: Expr::Literal(Literal::None),
45 reference: None,
46 }
47 }
48}
49impl ToSql for DefineFieldStatement {
50 fn fmt_sql(&self, f: &mut String, sql_fmt: SqlFormat) {
51 f.push_str("DEFINE FIELD");
52 match self.kind {
53 DefineKind::Default => {}
54 DefineKind::Overwrite => f.push_str(" OVERWRITE"),
55 DefineKind::IfNotExists => f.push_str(" IF NOT EXISTS"),
56 }
57 write_sql!(
58 f,
59 sql_fmt,
60 " {} ON {}",
61 CoverStmts(&self.name),
62 CoverStmts(&self.what)
63 );
64 if let Some(ref v) = self.field_kind {
65 write_sql!(f, sql_fmt, " TYPE {}", v);
66 if self.flexible {
67 f.push_str(" FLEXIBLE");
68 }
69 }
70 match self.default {
71 DefineDefault::None => {}
72 DefineDefault::Always(ref expr) => {
73 write_sql!(f, sql_fmt, " DEFAULT ALWAYS {}", CoverStmts(expr));
74 }
75 DefineDefault::Set(ref expr) => {
76 write_sql!(f, sql_fmt, " DEFAULT {}", CoverStmts(expr));
77 }
78 }
79 if self.readonly {
80 f.push_str(" READONLY");
81 }
82 if let Some(ref v) = self.value {
83 write_sql!(f, sql_fmt, " VALUE {}", CoverStmts(v))
84 }
85 if let Some(ref v) = self.assert {
86 write_sql!(f, sql_fmt, " ASSERT {}", CoverStmts(v))
87 }
88 if let Some(ref v) = self.computed {
89 write_sql!(f, sql_fmt, " COMPUTED {}", CoverStmts(v))
90 }
91 if let Some(ref v) = self.reference {
92 write_sql!(f, sql_fmt, " REFERENCE {v}");
93 }
94 if !matches!(self.comment, Expr::Literal(Literal::None)) {
95 write_sql!(f, sql_fmt, " COMMENT {}", CoverStmts(&self.comment));
96 }
97 if sql_fmt.is_pretty() {
98 f.push('\n');
99 sql_fmt.write_indent(f);
100 } else {
101 f.push(' ');
102 }
103 self.permissions.fmt_sql(f, sql_fmt);
104 }
105}