Skip to main content

surql_parser/upstream/sql/statements/define/
field.rs

1use 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}