use std::io::Write;
use icechunk_types::ICResultExt as _;
use crate::{
IcechunkFormatError, IcechunkFormatErrorKind, format_constants::SpecVersionBin,
manifest::Manifest, repo_info::RepoInfo, snapshot::Snapshot,
transaction_log::TransactionLog,
};
pub fn serialize_snapshot(
snapshot: &Snapshot,
version: SpecVersionBin,
write: &mut impl Write,
) -> Result<(), std::io::Error> {
match version {
SpecVersionBin::V1 | SpecVersionBin::V2 => write.write_all(snapshot.bytes()),
}
}
pub fn serialize_manifest(
manifest: &Manifest,
version: SpecVersionBin,
write: &mut impl Write,
) -> Result<(), std::io::Error> {
match version {
SpecVersionBin::V1 | SpecVersionBin::V2 => write.write_all(manifest.bytes()),
}
}
pub fn serialize_transaction_log(
transaction_log: &TransactionLog,
version: SpecVersionBin,
write: &mut impl Write,
) -> Result<(), std::io::Error> {
match version {
SpecVersionBin::V1 | SpecVersionBin::V2 => {
write.write_all(transaction_log.bytes())
}
}
}
pub fn serialize_repo_info(
info: &RepoInfo,
version: SpecVersionBin,
write: &mut impl Write,
) -> Result<(), std::io::Error> {
match version {
SpecVersionBin::V2 => write.write_all(info.bytes()),
SpecVersionBin::V1 => Err(std::io::Error::new(
std::io::ErrorKind::Unsupported,
"Trying to write to an old Icechunk format version. Aborting.",
)),
}
}
pub fn deserialize_snapshot(
version: SpecVersionBin,
buffer: Vec<u8>,
) -> Result<Snapshot, IcechunkFormatError> {
match version {
SpecVersionBin::V1 | SpecVersionBin::V2 => Snapshot::from_buffer(version, buffer),
}
}
pub fn deserialize_manifest(
version: SpecVersionBin,
buffer: Vec<u8>,
) -> Result<Manifest, IcechunkFormatError> {
match version {
SpecVersionBin::V1 | SpecVersionBin::V2 => Manifest::from_buffer(buffer),
}
}
pub fn deserialize_transaction_log(
version: SpecVersionBin,
buffer: Vec<u8>,
) -> Result<TransactionLog, IcechunkFormatError> {
match version {
SpecVersionBin::V1 | SpecVersionBin::V2 => TransactionLog::from_buffer(buffer),
}
}
pub fn deserialize_repo_info(
version: SpecVersionBin,
buffer: Vec<u8>,
) -> Result<RepoInfo, IcechunkFormatError> {
match version {
SpecVersionBin::V2 => RepoInfo::from_buffer(buffer),
SpecVersionBin::V1 => {
Err(IcechunkFormatErrorKind::UnsupportedOperationForVersion {
version: SpecVersionBin::V1 as u8,
})
.capture()
}
}
}