Skip to content

Commit

Permalink
chore: improve impl/test modularity
Browse files Browse the repository at this point in the history
  • Loading branch information
dj8yf0μl committed Nov 13, 2023
1 parent 4ce232e commit fe794cb
Show file tree
Hide file tree
Showing 13 changed files with 1,686 additions and 176 deletions.
4 changes: 2 additions & 2 deletions .github/test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ export INSTA_UPDATE=no
pushd borsh
cargo test --no-run
cargo test
cargo test --features ascii,unstable__schema
cargo test --features unstable__schema,ascii --test test_ascii_strings
cargo test --features derive
cargo test --features unstable__schema
cargo test --test test_rc --features rc
cargo test --test test_hash_map --test test_btree_map --features de_strict_order

cargo test --no-default-features
cargo test --no-default-features --features ascii,unstable__schema
cargo test --no-default-features --features unstable__schema,ascii --test test_ascii_strings
cargo test --no-default-features --features derive
cargo test --no-default-features --features unstable__schema
cargo test --no-default-features --test test_rc --features rc
Expand Down
37 changes: 23 additions & 14 deletions borsh/src/de/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -370,23 +370,32 @@ impl BorshDeserialize for String {
}
}

/// Module is available if borsh is built with `features = ["ascii"]`.
#[cfg(feature = "ascii")]
impl BorshDeserialize for ascii::AsciiString {
#[inline]
fn deserialize_reader<R: Read>(reader: &mut R) -> Result<Self> {
let bytes = Vec::<u8>::deserialize_reader(reader)?;
ascii::AsciiString::from_ascii(bytes)
.map_err(|err| Error::new(ErrorKind::InvalidData, err.to_string()))
pub mod ascii {
//!
//! Module defines [BorshDeserialize] implementation for
//! some types from [ascii](::ascii) crate.
use crate::BorshDeserialize;
use crate::__private::maybestd::{string::ToString, vec::Vec};
use crate::io::{Error, ErrorKind, Read, Result};

impl BorshDeserialize for ascii::AsciiString {
#[inline]
fn deserialize_reader<R: Read>(reader: &mut R) -> Result<Self> {
let bytes = Vec::<u8>::deserialize_reader(reader)?;
ascii::AsciiString::from_ascii(bytes)
.map_err(|err| Error::new(ErrorKind::InvalidData, err.to_string()))
}
}
}

#[cfg(feature = "ascii")]
impl BorshDeserialize for ascii::AsciiChar {
#[inline]
fn deserialize_reader<R: Read>(reader: &mut R) -> Result<Self> {
let byte = u8::deserialize_reader(reader)?;
ascii::AsciiChar::from_ascii(byte)
.map_err(|err| Error::new(ErrorKind::InvalidData, err.to_string()))
impl BorshDeserialize for ascii::AsciiChar {
#[inline]
fn deserialize_reader<R: Read>(reader: &mut R) -> Result<Self> {
let byte = u8::deserialize_reader(reader)?;
ascii::AsciiChar::from_ascii(byte)
.map_err(|err| Error::new(ErrorKind::InvalidData, err.to_string()))
}
}
}

Expand Down
3 changes: 3 additions & 0 deletions borsh/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@
* **bson** -
Gates implementation of [BorshSerialize] and [BorshDeserialize]
for [ObjectId](bson::oid::ObjectId).
* **ascii** -
Gates implementation of [BorshSerialize], [BorshDeserialize], [BorshSchema] for
types from [ascii](https://docs.rs/ascii/1.1.0/ascii/) crate.
* **de_strict_order** -
Enables check that keys, parsed during deserialization of
[HashMap](std::collections::HashMap)/[HashSet](std::collections::HashSet) and
Expand Down
109 changes: 43 additions & 66 deletions borsh/src/schema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -402,45 +402,54 @@ impl BorshSchema for str {
}
}

/// Module is available if borsh is built with `features = ["ascii"]`.
#[cfg(feature = "ascii")]
impl BorshSchema for ascii::AsciiString {
#[inline]
fn add_definitions_recursively(definitions: &mut BTreeMap<Declaration, Definition>) {
ascii::AsciiStr::add_definitions_recursively(definitions);
}
#[inline]
fn declaration() -> Declaration {
ascii::AsciiStr::declaration()
}
}
pub mod ascii {
//!
//! Module defines [BorshSchema] implementation for
//! some types from [ascii](::ascii) crate.
use crate::BorshSchema;

#[cfg(feature = "ascii")]
impl BorshSchema for ascii::AsciiStr {
#[inline]
fn add_definitions_recursively(definitions: &mut BTreeMap<Declaration, Definition>) {
let definition = Definition::Sequence {
length_width: Definition::DEFAULT_LENGTH_WIDTH,
length_range: Definition::DEFAULT_LENGTH_RANGE,
elements: ascii::AsciiChar::declaration(),
};
add_definition(Self::declaration(), definition, definitions);
ascii::AsciiChar::add_definitions_recursively(definitions);
}
#[inline]
fn declaration() -> Declaration {
"AsciiString".into()
use super::{add_definition, Declaration, Definition};
use crate::__private::maybestd::collections::BTreeMap;

impl BorshSchema for ascii::AsciiString {
#[inline]
fn add_definitions_recursively(definitions: &mut BTreeMap<Declaration, Definition>) {
ascii::AsciiStr::add_definitions_recursively(definitions);
}
#[inline]
fn declaration() -> Declaration {
ascii::AsciiStr::declaration()
}
}
}

#[cfg(feature = "ascii")]
impl BorshSchema for ascii::AsciiChar {
#[inline]
fn add_definitions_recursively(definitions: &mut BTreeMap<Declaration, Definition>) {
add_definition(Self::declaration(), Definition::Primitive(1), definitions);
impl BorshSchema for ascii::AsciiStr {
#[inline]
fn add_definitions_recursively(definitions: &mut BTreeMap<Declaration, Definition>) {
let definition = Definition::Sequence {
length_width: Definition::DEFAULT_LENGTH_WIDTH,
length_range: Definition::DEFAULT_LENGTH_RANGE,
elements: ascii::AsciiChar::declaration(),
};
add_definition(Self::declaration(), definition, definitions);
ascii::AsciiChar::add_definitions_recursively(definitions);
}
#[inline]
fn declaration() -> Declaration {
"AsciiString".into()
}
}
#[inline]
fn declaration() -> Declaration {
"AsciiChar".into()

impl BorshSchema for ascii::AsciiChar {
#[inline]
fn add_definitions_recursively(definitions: &mut BTreeMap<Declaration, Definition>) {
add_definition(Self::declaration(), Definition::Primitive(1), definitions);
}
#[inline]
fn declaration() -> Declaration {
"AsciiChar".into()
}
}
}

Expand Down Expand Up @@ -1100,38 +1109,6 @@ mod tests {
);
}

#[test]
#[cfg(feature = "ascii")]
fn ascii_string() {
assert_eq!("AsciiString", ascii::AsciiStr::declaration());
assert_eq!("AsciiString", ascii::AsciiString::declaration());
assert_eq!("AsciiChar", ascii::AsciiChar::declaration());

let want_char = map! {
"AsciiChar" => Definition::Primitive(1)
};
let mut actual_defs = map!();
ascii::AsciiChar::add_definitions_recursively(&mut actual_defs);
assert_eq!(want_char, actual_defs);

let want = map! {
"AsciiString" => Definition::Sequence {
length_width: Definition::DEFAULT_LENGTH_WIDTH,
length_range: Definition::DEFAULT_LENGTH_RANGE,
elements: "AsciiChar".to_string()
},
"AsciiChar" => Definition::Primitive(1)
};

let mut actual_defs = map!();
ascii::AsciiStr::add_definitions_recursively(&mut actual_defs);
assert_eq!(want, actual_defs);

let mut actual_defs = map!();
ascii::AsciiString::add_definitions_recursively(&mut actual_defs);
assert_eq!(want, actual_defs);
}

#[test]
fn boxed_schema() {
let boxed_declaration = Box::<str>::declaration();
Expand Down
39 changes: 23 additions & 16 deletions borsh/src/ser/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -210,27 +210,34 @@ impl BorshSerialize for String {
}
}

/// Module is available if borsh is built with `features = ["ascii"]`.
#[cfg(feature = "ascii")]
impl BorshSerialize for ascii::AsciiChar {
#[inline]
fn serialize<W: Write>(&self, writer: &mut W) -> Result<()> {
self.as_byte().serialize(writer)
pub mod ascii {
//!
//! Module defines [BorshSerialize] implementation for
//! some types from [ascii](::ascii) crate.
use super::BorshSerialize;
use crate::io::{Result, Write};

impl BorshSerialize for ascii::AsciiChar {
#[inline]
fn serialize<W: Write>(&self, writer: &mut W) -> Result<()> {
self.as_byte().serialize(writer)
}
}
}

#[cfg(feature = "ascii")]
impl BorshSerialize for ascii::AsciiStr {
#[inline]
fn serialize<W: Write>(&self, writer: &mut W) -> Result<()> {
self.as_bytes().serialize(writer)
impl BorshSerialize for ascii::AsciiStr {
#[inline]
fn serialize<W: Write>(&self, writer: &mut W) -> Result<()> {
self.as_bytes().serialize(writer)
}
}
}

#[cfg(feature = "ascii")]
impl BorshSerialize for ascii::AsciiString {
#[inline]
fn serialize<W: Write>(&self, writer: &mut W) -> Result<()> {
self.as_bytes().serialize(writer)
impl BorshSerialize for ascii::AsciiString {
#[inline]
fn serialize<W: Write>(&self, writer: &mut W) -> Result<()> {
self.as_bytes().serialize(writer)
}
}
}

Expand Down
11 changes: 11 additions & 0 deletions borsh/tests/snapshots/test_ascii_strings__a.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
source: borsh/tests/test_ascii_strings.rs
expression: buf
---
[
1,
0,
0,
0,
97,
]
10 changes: 10 additions & 0 deletions borsh/tests/snapshots/test_ascii_strings__empty_string.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
source: borsh/tests/test_ascii_strings.rs
expression: buf
---
[
0,
0,
0,
0,
]
Loading

0 comments on commit fe794cb

Please sign in to comment.