Skip to main content

surrealdb_types/flatbuffers/
misc.rs

1use std::ops::Bound;
2use std::str::FromStr;
3
4use surrealdb_protocol::fb::v1::{self as proto_fb, ValueBound};
5
6use super::{FromFlatbuffers, ToFlatbuffers};
7use crate::{File, Range, Regex, Value};
8
9impl ToFlatbuffers for File {
10	type Output<'bldr> = flatbuffers::WIPOffset<proto_fb::File<'bldr>>;
11
12	#[inline]
13	fn to_fb<'bldr>(
14		&self,
15		builder: &mut flatbuffers::FlatBufferBuilder<'bldr>,
16	) -> anyhow::Result<Self::Output<'bldr>> {
17		let bucket = builder.create_string(&self.bucket);
18		let key = builder.create_string(&self.key);
19		Ok(proto_fb::File::create(
20			builder,
21			&proto_fb::FileArgs {
22				bucket: Some(bucket),
23				key: Some(key),
24			},
25		))
26	}
27}
28
29impl FromFlatbuffers for File {
30	type Input<'a> = proto_fb::File<'a>;
31
32	#[inline]
33	fn from_fb(input: Self::Input<'_>) -> anyhow::Result<Self> {
34		let bucket = input.bucket().ok_or_else(|| anyhow::anyhow!("Missing bucket in File"))?;
35		let key = input.key().ok_or_else(|| anyhow::anyhow!("Missing key in File"))?;
36		Ok(File {
37			bucket: bucket.to_string(),
38			key: key.to_string(),
39		})
40	}
41}
42
43impl ToFlatbuffers for Regex {
44	type Output<'bldr> = flatbuffers::WIPOffset<proto_fb::StringValue<'bldr>>;
45
46	#[inline]
47	fn to_fb<'bldr>(
48		&self,
49		builder: &mut flatbuffers::FlatBufferBuilder<'bldr>,
50	) -> anyhow::Result<Self::Output<'bldr>> {
51		let value = builder.create_string(self.0.as_str());
52		Ok(proto_fb::StringValue::create(
53			builder,
54			&proto_fb::StringValueArgs {
55				value: Some(value),
56			},
57		))
58	}
59}
60
61impl FromFlatbuffers for Regex {
62	type Input<'a> = proto_fb::StringValue<'a>;
63
64	#[inline]
65	fn from_fb(input: Self::Input<'_>) -> anyhow::Result<Self> {
66		let pattern = input.value().ok_or_else(|| anyhow::anyhow!("Missing regex value"))?;
67		Ok(Regex::from_str(pattern)?)
68	}
69}
70
71impl ToFlatbuffers for Range {
72	type Output<'bldr> = flatbuffers::WIPOffset<proto_fb::Range<'bldr>>;
73
74	#[inline]
75	fn to_fb<'bldr>(
76		&self,
77		builder: &mut flatbuffers::FlatBufferBuilder<'bldr>,
78	) -> anyhow::Result<Self::Output<'bldr>> {
79		let (start_type, start) = self.start.to_fb(builder)?;
80		let (end_type, end) = self.end.to_fb(builder)?;
81		Ok(proto_fb::Range::create(
82			builder,
83			&proto_fb::RangeArgs {
84				start_type,
85				start,
86				end_type,
87				end,
88			},
89		))
90	}
91}
92
93impl FromFlatbuffers for Range {
94	type Input<'a> = proto_fb::Range<'a>;
95
96	#[inline]
97	fn from_fb(input: Self::Input<'_>) -> anyhow::Result<Self> {
98		let start = match input.start_type() {
99			ValueBound::Unbounded => {
100				input
101					.start_as_unbounded()
102					.ok_or_else(|| anyhow::anyhow!("Missing start in Range"))?;
103				Bound::Unbounded
104			}
105			ValueBound::Inclusive => {
106				let start = input
107					.start_as_inclusive()
108					.ok_or_else(|| anyhow::anyhow!("Missing start in Range"))?;
109				Bound::Included(Value::from_fb(start)?)
110			}
111			ValueBound::Exclusive => {
112				let start = input
113					.start_as_exclusive()
114					.ok_or_else(|| anyhow::anyhow!("Missing start in Range"))?;
115				Bound::Excluded(Value::from_fb(start)?)
116			}
117			_ => return Err(anyhow::anyhow!("Invalid start type in Range")),
118		};
119
120		let end = match input.end_type() {
121			ValueBound::Unbounded => {
122				input.end_as_unbounded().ok_or_else(|| anyhow::anyhow!("Missing end in Range"))?;
123				Bound::Unbounded
124			}
125			ValueBound::Inclusive => {
126				let end = input
127					.end_as_inclusive()
128					.ok_or_else(|| anyhow::anyhow!("Missing end in Range"))?;
129				Bound::Included(Value::from_fb(end)?)
130			}
131			ValueBound::Exclusive => {
132				let end = input
133					.end_as_exclusive()
134					.ok_or_else(|| anyhow::anyhow!("Missing end in Range"))?;
135				Bound::Excluded(Value::from_fb(end)?)
136			}
137			_ => return Err(anyhow::anyhow!("Invalid end type in Range")),
138		};
139
140		Ok(Range {
141			start,
142			end,
143		})
144	}
145}
146
147impl ToFlatbuffers for Bound<Value> {
148	type Output<'bldr> =
149		(proto_fb::ValueBound, Option<flatbuffers::WIPOffset<flatbuffers::UnionWIPOffset>>);
150
151	#[inline]
152	fn to_fb<'bldr>(
153		&self,
154		builder: &mut flatbuffers::FlatBufferBuilder<'bldr>,
155	) -> anyhow::Result<Self::Output<'bldr>> {
156		Ok(match self {
157			Bound::Included(value) => {
158				let value = value.to_fb(builder)?.as_union_value();
159				(proto_fb::ValueBound::Inclusive, Some(value))
160			}
161			Bound::Excluded(value) => {
162				let value = value.to_fb(builder)?.as_union_value();
163				(proto_fb::ValueBound::Exclusive, Some(value))
164			}
165			Bound::Unbounded => {
166				let null_value = proto_fb::NullValue::create(builder, &proto_fb::NullValueArgs {});
167				(proto_fb::ValueBound::Unbounded, Some(null_value.as_union_value()))
168			}
169		})
170	}
171}