Skip to content

Commit 0aed53c

Browse files
authored
refactor(encoding): simplify value encoding by using Key trait (#466)
Replace custom encode_inner implementation with Key trait methods for consistency and maintainability. This change removes duplicate code and centralizes encoding logic.
1 parent bd3fe51 commit 0aed53c

File tree

1 file changed

+4
-123
lines changed

1 file changed

+4
-123
lines changed

src/record/dynamic/value/encoding.rs

Lines changed: 4 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -10,103 +10,14 @@ use futures_util::future::LocalBoxFuture;
1010
use futures_util::FutureExt;
1111

1212
use super::{TimeUnit, Value};
13-
use crate::record::{decode_arrow_datatype, encode_arrow_datatype, ValueError, ValueRef};
13+
use crate::record::{decode_arrow_datatype, encode_arrow_datatype, Key, ValueError, ValueRef};
1414

1515
#[cfg(not(target_arch = "wasm32"))]
1616
type BoxedFuture<'a, T> = BoxFuture<'a, T>;
1717
#[cfg(target_arch = "wasm32")]
1818
type BoxedFuture<'a, T> = LocalBoxFuture<'a, T>;
1919

2020
impl Value {
21-
fn encode_inner<'a, 'b, W>(
22-
&'a self,
23-
writer: &'b mut W,
24-
) -> BoxedFuture<'a, Result<(), fusio::Error>>
25-
where
26-
W: Write,
27-
'b: 'a,
28-
{
29-
let fut = async move {
30-
encode_arrow_datatype(&self.data_type(), writer).await?;
31-
match self {
32-
Value::Null => (),
33-
Value::Boolean(v) => {
34-
v.encode(writer).await?;
35-
}
36-
Value::Int8(v) => {
37-
v.encode(writer).await?;
38-
}
39-
Value::Int16(v) => {
40-
v.encode(writer).await?;
41-
}
42-
Value::Int32(v) => {
43-
v.encode(writer).await?;
44-
}
45-
Value::Int64(v) => {
46-
v.encode(writer).await?;
47-
}
48-
Value::UInt8(v) => {
49-
v.encode(writer).await?;
50-
}
51-
Value::UInt16(v) => {
52-
v.encode(writer).await?;
53-
}
54-
Value::UInt32(v) => {
55-
v.encode(writer).await?;
56-
}
57-
Value::UInt64(v) => {
58-
v.encode(writer).await?;
59-
}
60-
Value::Float32(v) => {
61-
v.encode(writer).await?;
62-
}
63-
Value::Float64(v) => {
64-
v.encode(writer).await?;
65-
}
66-
Value::String(v) => {
67-
v.encode(writer).await?;
68-
}
69-
Value::Binary(items) => {
70-
items.encode(writer).await?;
71-
}
72-
Value::Date32(v) => {
73-
v.encode(writer).await?;
74-
}
75-
Value::Date64(v) => {
76-
v.encode(writer).await?;
77-
}
78-
Value::Timestamp(v, _) => {
79-
v.encode(writer).await?;
80-
}
81-
Value::Time32(v, _) => {
82-
v.encode(writer).await?;
83-
}
84-
Value::Time64(v, _) => {
85-
v.encode(writer).await?;
86-
}
87-
Value::FixedSizeBinary(v, _) => {
88-
v.encode(writer).await?;
89-
}
90-
Value::List(_, vec) => {
91-
let len = vec.len() as u32;
92-
len.encode(writer).await?;
93-
for v in vec.iter() {
94-
v.encode_inner(writer).await?;
95-
}
96-
}
97-
}
98-
Ok(())
99-
};
100-
#[cfg(not(target_arch = "wasm32"))]
101-
{
102-
fut.boxed()
103-
}
104-
#[cfg(target_arch = "wasm32")]
105-
{
106-
fut.boxed_local()
107-
}
108-
}
109-
11021
fn decode_inner<R>(reader: &mut R) -> BoxedFuture<'_, Result<Self, fusio::Error>>
11122
where
11223
R: fusio::SeqRead,
@@ -187,41 +98,11 @@ impl Encode for Value {
18798
where
18899
W: Write,
189100
{
190-
self.encode_inner(writer).await
101+
self.as_key_ref().encode(writer).await
191102
}
192103

193104
fn size(&self) -> usize {
194-
match self {
195-
Value::Null => 1,
196-
Value::Boolean(v) => 1 + v.size(),
197-
Value::Int8(v) => 1 + v.size(),
198-
Value::Int16(v) => 1 + v.size(),
199-
Value::Int32(v) => 1 + v.size(),
200-
Value::Int64(v) => 1 + v.size(),
201-
Value::UInt8(v) => 1 + v.size(),
202-
Value::UInt16(v) => 1 + v.size(),
203-
Value::UInt32(v) => 1 + v.size(),
204-
Value::UInt64(v) => 1 + v.size(),
205-
Value::Float32(v) => 1 + v.size(),
206-
Value::Float64(v) => 1 + v.size(),
207-
Value::String(v) => 1 + v.size(),
208-
Value::Binary(v) => 1 + v.size(),
209-
Value::FixedSizeBinary(v, _) => 1 + v.size(),
210-
Value::Date32(v) => 1 + v.size(),
211-
Value::Date64(v) => 1 + v.size(),
212-
Value::Timestamp(v, time_unit) => 1 + v.size() + time_unit.size(),
213-
Value::Time32(v, time_unit) => 1 + v.size() + time_unit.size(),
214-
Value::Time64(v, time_unit) => 1 + v.size() + time_unit.size(),
215-
Value::List(data_type, vec) => {
216-
vec.iter().map(|v| v.size()).sum::<usize>()
217-
+ match data_type {
218-
DataType::Timestamp(_, _) => 2,
219-
DataType::Time32(_) | DataType::Time64(_) => 2,
220-
DataType::List(field) => 1 + field.size(),
221-
_ => 1,
222-
}
223-
}
224-
}
105+
self.as_key_ref().size()
225106
}
226107
}
227108

@@ -342,7 +223,7 @@ impl ValueRef<'_> {
342223
let len = vec.len() as u32;
343224
len.encode(writer).await?;
344225
for v in vec.iter() {
345-
v.encode_inner(writer).await?;
226+
v.as_key_ref().encode_inner(writer).await?;
346227
}
347228
}
348229
}

0 commit comments

Comments
 (0)