Skip to main content

surrealdb_expr/expr/convert/
kind.rs

1//! `sql` -> `expr` conversions for [`crate::sql::kind`].
2//!
3//! Lives in core rather than beside the AST: `surrealdb-sql` sits below
4//! core, so it cannot name `expr` types.
5
6use crate::sql::kind::*;
7
8impl From<GeometryKind> for crate::expr::kind::GeometryKind {
9	fn from(v: GeometryKind) -> Self {
10		match v {
11			GeometryKind::Point => crate::expr::kind::GeometryKind::Point,
12			GeometryKind::Line => crate::expr::kind::GeometryKind::Line,
13			GeometryKind::Polygon => crate::expr::kind::GeometryKind::Polygon,
14			GeometryKind::MultiPoint => crate::expr::kind::GeometryKind::MultiPoint,
15			GeometryKind::MultiLine => crate::expr::kind::GeometryKind::MultiLine,
16			GeometryKind::MultiPolygon => crate::expr::kind::GeometryKind::MultiPolygon,
17			GeometryKind::Collection => crate::expr::kind::GeometryKind::Collection,
18		}
19	}
20}
21
22impl From<crate::expr::kind::GeometryKind> for GeometryKind {
23	fn from(v: crate::expr::kind::GeometryKind) -> Self {
24		match v {
25			crate::expr::kind::GeometryKind::Point => GeometryKind::Point,
26			crate::expr::kind::GeometryKind::Line => GeometryKind::Line,
27			crate::expr::kind::GeometryKind::Polygon => GeometryKind::Polygon,
28			crate::expr::kind::GeometryKind::MultiPoint => GeometryKind::MultiPoint,
29			crate::expr::kind::GeometryKind::MultiLine => GeometryKind::MultiLine,
30			crate::expr::kind::GeometryKind::MultiPolygon => GeometryKind::MultiPolygon,
31			crate::expr::kind::GeometryKind::Collection => GeometryKind::Collection,
32		}
33	}
34}
35
36impl From<Kind> for crate::expr::Kind {
37	fn from(v: Kind) -> Self {
38		match v {
39			Kind::Any => crate::expr::Kind::Any,
40			Kind::None => crate::expr::Kind::None,
41			Kind::Null => crate::expr::Kind::Null,
42			Kind::Bool => crate::expr::Kind::Bool,
43			Kind::Bytes => crate::expr::Kind::Bytes,
44			Kind::Datetime => crate::expr::Kind::Datetime,
45			Kind::Decimal => crate::expr::Kind::Decimal,
46			Kind::Duration => crate::expr::Kind::Duration,
47			Kind::Float => crate::expr::Kind::Float,
48			Kind::Int => crate::expr::Kind::Int,
49			Kind::Number => crate::expr::Kind::Number,
50			Kind::Object => crate::expr::Kind::Object,
51			Kind::String => crate::expr::Kind::String,
52			Kind::Uuid => crate::expr::Kind::Uuid,
53			Kind::Regex => crate::expr::Kind::Regex,
54			Kind::Table(tables) => {
55				crate::expr::Kind::Table(tables.into_iter().map(Into::into).collect())
56			}
57			Kind::Record(tables) => {
58				crate::expr::Kind::Record(tables.into_iter().map(Into::into).collect())
59			}
60			Kind::Geometry(geometries) => {
61				crate::expr::Kind::Geometry(geometries.into_iter().map(Into::into).collect())
62			}
63			Kind::Either(kinds) => {
64				crate::expr::Kind::Either(kinds.into_iter().map(Into::into).collect())
65			}
66			Kind::Set(k, l) => crate::expr::Kind::Set(Box::new(k.as_ref().clone().into()), l),
67			Kind::Array(k, l) => crate::expr::Kind::Array(Box::new(k.as_ref().clone().into()), l),
68			Kind::Function(args, ret) => crate::expr::Kind::Function(
69				args.map(|args| args.into_iter().map(Into::into).collect()),
70				ret.map(|ret| Box::new((*ret).into())),
71			),
72			Kind::Range => crate::expr::Kind::Range,
73			Kind::Literal(l) => crate::expr::Kind::Literal(l.into()),
74			Kind::File(k) => crate::expr::Kind::File(k),
75		}
76	}
77}
78
79impl From<crate::expr::Kind> for Kind {
80	fn from(v: crate::expr::Kind) -> Self {
81		match v {
82			crate::expr::Kind::Any => Kind::Any,
83			crate::expr::Kind::None => Kind::None,
84			crate::expr::Kind::Null => Kind::Null,
85			crate::expr::Kind::Bool => Kind::Bool,
86			crate::expr::Kind::Bytes => Kind::Bytes,
87			crate::expr::Kind::Datetime => Kind::Datetime,
88			crate::expr::Kind::Decimal => Kind::Decimal,
89			crate::expr::Kind::Duration => Kind::Duration,
90			crate::expr::Kind::Float => Kind::Float,
91			crate::expr::Kind::Int => Kind::Int,
92			crate::expr::Kind::Number => Kind::Number,
93			crate::expr::Kind::Object => Kind::Object,
94			crate::expr::Kind::String => Kind::String,
95			crate::expr::Kind::Uuid => Kind::Uuid,
96			crate::expr::Kind::Regex => Kind::Regex,
97			crate::expr::Kind::Table(tables) => {
98				Kind::Table(tables.into_iter().map(Into::into).collect())
99			}
100			crate::expr::Kind::Record(tables) => {
101				Kind::Record(tables.into_iter().map(Into::into).collect())
102			}
103			crate::expr::Kind::Geometry(geometries) => {
104				Kind::Geometry(geometries.into_iter().map(Into::into).collect())
105			}
106			crate::expr::Kind::Either(kinds) => {
107				let kinds: Vec<Kind> = kinds.into_iter().map(Into::into).collect();
108				if kinds.is_empty() {
109					return Self::Either(vec![Self::Any]);
110				}
111				Self::Either(kinds)
112			}
113			crate::expr::Kind::Set(k, l) => Self::Set(Box::new((*k).into()), l),
114			crate::expr::Kind::Array(k, l) => Self::Array(Box::new((*k).into()), l),
115			crate::expr::Kind::Function(args, ret) => Self::Function(
116				args.map(|args| args.into_iter().map(Into::into).collect()),
117				ret.map(|ret| Box::new((*ret).into())),
118			),
119			crate::expr::Kind::Range => Self::Range,
120			crate::expr::Kind::Literal(l) => Self::Literal(l.into()),
121			crate::expr::Kind::File(k) => Kind::File(k),
122		}
123	}
124}
125
126impl From<KindLiteral> for crate::expr::kind::KindLiteral {
127	fn from(v: KindLiteral) -> Self {
128		match v {
129			KindLiteral::String(s) => crate::expr::kind::KindLiteral::String(s),
130			KindLiteral::Integer(i) => crate::expr::kind::KindLiteral::Integer(i),
131			KindLiteral::Float(f) => crate::expr::kind::KindLiteral::Float(f),
132			KindLiteral::Decimal(d) => crate::expr::kind::KindLiteral::Decimal(d),
133			KindLiteral::Duration(d) => crate::expr::kind::KindLiteral::Duration(d.into()),
134			KindLiteral::Array(a) => {
135				crate::expr::kind::KindLiteral::Array(a.into_iter().map(Into::into).collect())
136			}
137			KindLiteral::Object(o) => crate::expr::kind::KindLiteral::Object(
138				o.into_iter().map(|(k, v)| (k, v.into())).collect(),
139			),
140			KindLiteral::Bool(b) => crate::expr::kind::KindLiteral::Bool(b),
141		}
142	}
143}
144
145impl From<crate::expr::kind::KindLiteral> for KindLiteral {
146	fn from(v: crate::expr::kind::KindLiteral) -> Self {
147		match v {
148			crate::expr::kind::KindLiteral::String(s) => Self::String(s),
149			crate::expr::kind::KindLiteral::Integer(i) => Self::Integer(i),
150			crate::expr::kind::KindLiteral::Float(f) => Self::Float(f),
151			crate::expr::kind::KindLiteral::Decimal(d) => Self::Decimal(d),
152			crate::expr::kind::KindLiteral::Duration(d) => Self::Duration(d.into()),
153			crate::expr::kind::KindLiteral::Array(a) => {
154				Self::Array(a.into_iter().map(Into::into).collect())
155			}
156			crate::expr::kind::KindLiteral::Object(o) => {
157				Self::Object(o.into_iter().map(|(k, v)| (k, v.into())).collect())
158			}
159			crate::expr::kind::KindLiteral::Bool(b) => Self::Bool(b),
160		}
161	}
162}