surrealdb_types/flatbuffers/
misc.rs1use 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}