Skip to content

Commit 6929b79

Browse files
authored
feat: add handwritten serialize (#185)
* add handwritten serialize * revert expect * remove expect
1 parent 9ae9e13 commit 6929b79

File tree

1 file changed

+30
-12
lines changed

1 file changed

+30
-12
lines changed

crates/iceberg/src/spec/table_metadata.rs

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ pub(crate) static INITIAL_SEQUENCE_NUMBER: i64 = 0;
4444
/// Reference to [`TableMetadata`].
4545
pub type TableMetadataRef = Arc<TableMetadata>;
4646

47-
#[derive(Debug, PartialEq, Serialize, Deserialize, Eq, Clone)]
48-
#[serde(try_from = "TableMetadataEnum", into = "TableMetadataEnum")]
47+
#[derive(Debug, PartialEq, Deserialize, Eq, Clone)]
48+
#[serde(try_from = "TableMetadataEnum")]
4949
/// Fields for the version 2 of the table metadata.
5050
///
5151
/// We assume that this data structure is always valid, so we will panic when invalid error happens.
@@ -379,6 +379,19 @@ pub(super) mod _serde {
379379
#[derive(Debug, PartialEq, Eq)]
380380
pub(super) struct VersionNumber<const V: u8>;
381381

382+
impl Serialize for TableMetadata {
383+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
384+
where
385+
S: serde::Serializer,
386+
{
387+
// we must do a clone here
388+
let table_metadata_enum: TableMetadataEnum =
389+
self.clone().try_into().map_err(serde::ser::Error::custom)?;
390+
391+
table_metadata_enum.serialize(serializer)
392+
}
393+
}
394+
382395
impl<const V: u8> Serialize for VersionNumber<V> {
383396
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
384397
where
@@ -412,12 +425,13 @@ pub(super) mod _serde {
412425
}
413426
}
414427

415-
impl From<TableMetadata> for TableMetadataEnum {
416-
fn from(value: TableMetadata) -> Self {
417-
match value.format_version {
428+
impl TryFrom<TableMetadata> for TableMetadataEnum {
429+
type Error = Error;
430+
fn try_from(value: TableMetadata) -> Result<Self, Error> {
431+
Ok(match value.format_version {
418432
FormatVersion::V2 => TableMetadataEnum::V2(value.into()),
419-
FormatVersion::V1 => TableMetadataEnum::V1(value.into()),
420-
}
433+
FormatVersion::V1 => TableMetadataEnum::V1(value.try_into()?),
434+
})
421435
}
422436
}
423437

@@ -676,9 +690,10 @@ pub(super) mod _serde {
676690
}
677691
}
678692

679-
impl From<TableMetadata> for TableMetadataV1 {
680-
fn from(v: TableMetadata) -> Self {
681-
TableMetadataV1 {
693+
impl TryFrom<TableMetadata> for TableMetadataV1 {
694+
type Error = Error;
695+
fn try_from(v: TableMetadata) -> Result<Self, Error> {
696+
Ok(TableMetadataV1 {
682697
format_version: VersionNumber::<1>,
683698
table_uuid: Some(v.table_uuid),
684699
location: v.location,
@@ -687,7 +702,10 @@ pub(super) mod _serde {
687702
schema: v
688703
.schemas
689704
.get(&v.current_schema_id)
690-
.expect("current_schema_id not found in schemas")
705+
.ok_or(Error::new(
706+
ErrorKind::Unexpected,
707+
"current_schema_id not found in schemas",
708+
))?
691709
.as_ref()
692710
.clone()
693711
.into(),
@@ -748,7 +766,7 @@ pub(super) mod _serde {
748766
.collect(),
749767
),
750768
default_sort_order_id: Some(v.default_sort_order_id),
751-
}
769+
})
752770
}
753771
}
754772
}

0 commit comments

Comments
 (0)