Skip to main content

surrealdb_sql/statements/define/
field.rs

1use 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	/// Optional GraphQL alias declared via `GRAPHQL_ALIAS "..."`.
32	pub graphql_alias: Option<String>,
33	/// Optional GraphQL deprecation reason declared via
34	/// `GRAPHQL_DEPRECATED "..."`.
35	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}