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