Skip to content

Commit 352cef6

Browse files
committed
wip on refactoring strict serialize traits
1 parent b414396 commit 352cef6

File tree

3 files changed

+40
-20
lines changed

3 files changed

+40
-20
lines changed

rust/derive/tests/base.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ fn enum_custom_tags() -> common::Result {
194194
Five {},
195195
}
196196

197-
impl StrictSerialize for Assoc {}
197+
impl StrictSerialize<256> for Assoc {}
198198

199199
assert_eq!(Assoc::ALL_VARIANTS, &[
200200
(0, "one"),
@@ -205,13 +205,13 @@ fn enum_custom_tags() -> common::Result {
205205
]);
206206

207207
let assoc = Assoc::Two(0, 1, 2);
208-
assert_eq!(assoc.to_strict_serialized::<256>().unwrap().as_slice(), &[2, 0, 1, 0, 2, 0, 0, 0]);
208+
assert_eq!(assoc.to_strict_vec().unwrap().as_slice(), &[2, 0, 1, 0, 2, 0, 0, 0]);
209209

210210
let assoc = Assoc::One {
211211
hash: [0u8; 32],
212212
ord: 0,
213213
};
214-
assert_eq!(assoc.to_strict_serialized::<256>().unwrap().as_slice(), &[0u8; 34]);
214+
assert_eq!(assoc.to_strict_vec().unwrap().as_slice(), &[0u8; 34]);
215215

216216
Ok(())
217217
}

rust/derive/tests/type.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ fn skip_field() -> common::Result {
137137
must_camelize: 2,
138138
wrong_name: 3,
139139
};
140-
assert_eq!(val.to_strict_serialized::<{ usize::MAX }>().unwrap().as_slice(), &[2]);
140+
assert_eq!(val.to_strict_vec().unwrap().as_slice(), &[2]);
141141
let val = Struct {
142142
must_camelize: 2,
143143
wrong_name: 0,

rust/src/traits.rs

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -381,34 +381,54 @@ impl<T> StrictDecode for PhantomData<T> {
381381
fn strict_decode(_reader: &mut impl TypedRead) -> Result<Self, DecodeError> { Ok(default!()) }
382382
}
383383

384-
// TODO: Provide max length as a trait-level const
385-
pub trait StrictSerialize: StrictEncode {
386-
fn strict_serialized_len<const MAX: usize>(&self) -> io::Result<usize> {
384+
pub trait StrictSerialize<const MAX_SERIALIZED_LEN: usize>: StrictEncode {
385+
fn strict_serialize(&self, write: impl io::Write) -> Result<(), io::Error> {
386+
let writer = StreamWriter::new::<MAX_SERIALIZED_LEN>(write);
387+
self.strict_write(writer)
388+
}
389+
390+
fn to_strict_vec(&self) -> Result<Confined<Vec<u8>, 0, MAX_SERIALIZED_LEN>, SerializeError> {
391+
let ast_data = StrictWriter::in_memory::<MAX_SERIALIZED_LEN>();
392+
let data = self.strict_encode(ast_data)?.unbox().unconfine();
393+
Confined::<Vec<u8>, 0, MAX_SERIALIZED_LEN>::try_from(data).map_err(SerializeError::from)
394+
}
395+
396+
//#[cfg(feature = "std")]
397+
fn strict_serialize_to_path(
398+
&self,
399+
path: impl AsRef<std::path::Path>,
400+
overwrite: bool,
401+
) -> Result<(), SerializeError> {
402+
let file = if overwrite { fs::File::create(path)? } else { fs::File::create_new(path)? };
403+
self.strict_serialize(file)?;
404+
Ok(())
405+
}
406+
407+
#[deprecated(since = "3.0.0", note = "use `StrictEncode::strict_len` instead")]
408+
fn strict_serialized_len<const MAX: usize>(&self) -> io::Result<usize>
409+
where Self: StrictSerialize<MAX> {
387410
let counter = StrictWriter::counter::<MAX>();
388411
Ok(self.strict_encode(counter)?.unbox().unconfine().count)
389412
}
390413

414+
#[deprecated(since = "3.0.0", note = "use `to_strict_vec` instead")]
391415
fn to_strict_serialized<const MAX: usize>(
392416
&self,
393-
) -> Result<Confined<Vec<u8>, 0, MAX>, SerializeError> {
394-
let ast_data = StrictWriter::in_memory::<MAX>();
395-
let data = self.strict_encode(ast_data)?.unbox().unconfine();
396-
Confined::<Vec<u8>, 0, MAX>::try_from(data).map_err(SerializeError::from)
397-
}
398-
399-
fn strict_serialize<const MAX: usize>(&self, write: impl io::Write) -> Result<(), io::Error> {
400-
let writer = StreamWriter::new::<MAX>(write);
401-
self.strict_write(writer)
417+
) -> Result<Confined<Vec<u8>, 0, MAX>, SerializeError>
418+
where Self: StrictSerialize<MAX> {
419+
self.to_strict_vec()
402420
}
403421

422+
#[deprecated(since = "3.0.0", note = "use `strict_serialize_to_path` instead")]
404423
fn strict_serialize_to_file<const MAX: usize>(
405424
&self,
406425
path: impl AsRef<std::path::Path>,
407-
) -> Result<(), SerializeError> {
426+
) -> Result<(), SerializeError>
427+
where
428+
Self: StrictSerialize<MAX>,
429+
{
408430
let file = fs::File::create(path)?;
409-
// TODO: Do FileWriter
410-
let file = StrictWriter::with(StreamWriter::new::<MAX>(file));
411-
self.strict_encode(file)?;
431+
StrictSerialize::<MAX_SERIALIZED_LEN>::strict_serialize(self, file)?;
412432
Ok(())
413433
}
414434
}

0 commit comments

Comments
 (0)