Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(Rust): Implement TypeMeta part of the compatibility features #1789

Merged
merged 12 commits into from
Aug 5, 2024
Prev Previous commit
Next Next commit
streamline
  • Loading branch information
theweipeng committed Aug 2, 2024
commit 861b44ecedb7de50b98cb939c287bea20c2e70ca
28 changes: 24 additions & 4 deletions rust/fury-core/src/fury.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ use crate::buffer::{Reader, Writer};
use crate::error::Error;
use crate::read_state::ReadState;
use crate::serializer::Serializer;
use crate::types::Mode;
use crate::types::{config_flags, Language, Mode, SIZE_OF_REF_AND_TYPE};
use crate::write_state::WriteState;

pub struct Fury {
Expand All @@ -43,17 +43,37 @@ impl Fury {
&self.mode
}


pub fn write_head<T: Serializer>(&self, writer: &mut Writer) {
const HEAD_SIZE: usize = 10;
writer.reserve(<T as Serializer>::reserved_space() + SIZE_OF_REF_AND_TYPE + HEAD_SIZE);
let mut bitmap = 0;
bitmap |= config_flags::IS_LITTLE_ENDIAN_FLAG;
bitmap |= config_flags::IS_CROSS_LANGUAGE_FLAG;
writer.u8(bitmap);
writer.u8(Language::Rust as u8);
writer.skip(4); // native offset
writer.skip(4); // native size
}

fn read_head(&self, reader: &mut Reader) -> Result<(), Error> {
let _bitmap = reader.u8();
let _language: Language = reader.u8().try_into()?;
reader.skip(8); // native offset and size
Ok(())
}

pub fn deserialize<T: Serializer>(&self, bf: &[u8]) -> Result<T, Error> {
let reader = Reader::new(bf);
let mut reader = Reader::new(bf);
self.read_head(&mut reader)?;
let mut deserializer = ReadState::new(self, reader);
deserializer.head()?;
<T as Serializer>::deserialize(&mut deserializer)
}

pub fn serialize<T: Serializer>(&self, record: &T) -> Vec<u8> {
let mut writer = Writer::default();
self.write_head(&mut writer);
let mut serializer = WriteState::new(self, &mut writer);
serializer.head::<T>();
<T as Serializer>::serialize(record, &mut serializer);
writer.dump()
}
Expand Down
8 changes: 0 additions & 8 deletions rust/fury-core/src/read_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
// under the License.

use super::buffer::Reader;
use super::types::Language;
use crate::error::Error;
use crate::fury::Fury;

Expand All @@ -39,13 +38,6 @@ impl<'de, 'bf: 'de> ReadState<'de, 'bf> {
self.fury
}

pub fn head(&mut self) -> Result<(), Error> {
let _bitmap = self.reader.u8();
let _language: Language = self.reader.u8().try_into()?;
self.reader.skip(8); // native offset and size
Ok(())
}

pub fn read_tag(&mut self) -> Result<&str, Error> {
const USESTRINGVALUE: u8 = 0;
const USESTRINGID: u8 = 1;
Expand Down
17 changes: 0 additions & 17 deletions rust/fury-core/src/write_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,8 @@
// under the License.

use super::buffer::Writer;
use super::types::{config_flags, Language, SIZE_OF_REF_AND_TYPE};
use crate::fury::Fury;
use crate::meta::MetaWriterStore;
use crate::serializer::Serializer;

pub struct WriteState<'se> {
pub writer: &'se mut Writer,
Expand Down Expand Up @@ -64,19 +62,4 @@ impl<'se> WriteState<'se> {
}
};
}

pub fn head<T: Serializer>(&mut self) -> &Self {
const HEAD_SIZE: usize = 10;
self.writer
.reserve(<T as Serializer>::reserved_space() + SIZE_OF_REF_AND_TYPE + HEAD_SIZE);

let mut bitmap = 0;
bitmap |= config_flags::IS_LITTLE_ENDIAN_FLAG;
bitmap |= config_flags::IS_CROSS_LANGUAGE_FLAG;
self.writer.u8(bitmap);
self.writer.u8(Language::Rust as u8);
self.writer.skip(4); // native offset
self.writer.skip(4); // native size
self
}
}