From ec4c64a3258f80ac6ec7113b9a8722d08ab6aa78 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Tue, 6 Oct 2020 22:12:57 -0700 Subject: [PATCH 1/8] Use `doc-comment` crate to run readme doctests Delete `tests/readme.rs` in favor of using the `doc-comment` crate to run the doctests in README.md directly. --- Cargo.toml | 1 + README.md | 3 +- src/lib.rs | 3 + tests/readme.rs | 365 ------------------------------------------------ 4 files changed, 6 insertions(+), 366 deletions(-) delete mode 100644 tests/readme.rs diff --git a/Cargo.toml b/Cargo.toml index 7e7d7b3..efa8424 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,6 +37,7 @@ serde_ = { version = "^1.0" , optional = true, package = "serde" } serde_bytes = { version = "^0.11.3", optional = true } [dev-dependencies] +doc-comment = "0.3.3" regex = "^1.0" serde_derive = "^1.0" diff --git a/README.md b/README.md index 0c5fc30..c9746ef 100644 --- a/README.md +++ b/README.md @@ -617,8 +617,9 @@ respectively: ```rust -use serde::{Deserialize, Serialize}; +use serde_derive::{Deserialize, Serialize}; +#[serde(crate = "serde_")] #[derive(Serialize, Deserialize, PartialEq, Debug)] struct Foo { bar: String, diff --git a/src/lib.rs b/src/lib.rs index 58b35e5..22a9c7b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -21,3 +21,6 @@ pub mod state_tracker; pub mod serde; pub mod value; + +#[cfg(doctest)] +doc_comment::doctest!("../README.md"); diff --git a/tests/readme.rs b/tests/readme.rs deleted file mode 100644 index 35b342f..0000000 --- a/tests/readme.rs +++ /dev/null @@ -1,365 +0,0 @@ -// Please keep the code below in sync with `README.md`. -// -// If `cfg(doctest)` gets stablized or `cfg(test)` gets fixed, we can use -// doc-comment for running tests in `README.md`. - -mod encoding_1 { - use bendy::encoding::{Error, ToBencode}; - - #[test] - fn encode_vector() -> Result<(), Error> { - let my_data = vec!["hello", "world"]; - let encoded = my_data.to_bencode()?; - - assert_eq!(b"l5:hello5:worlde", encoded.as_slice()); - Ok(()) - } -} - -mod encoding_2 { - use bendy::encoding::{Error, SingleItemEncoder, ToBencode}; - - struct IntegerWrapper(i64); - - impl ToBencode for IntegerWrapper { - const MAX_DEPTH: usize = 0; - - fn encode(&self, encoder: SingleItemEncoder) -> Result<(), Error> { - encoder.emit_int(self.0) - } - } - - #[test] - fn encode_integer() -> Result<(), Error> { - let example = IntegerWrapper(21); - - let encoded = example.to_bencode()?; - assert_eq!(b"i21e", encoded.as_slice()); - - let encoded = 21.to_bencode()?; - assert_eq!(b"i21e", encoded.as_slice()); - - Ok(()) - } -} - -mod encoding_3 { - use bendy::encoding::{Error, SingleItemEncoder, ToBencode}; - - struct StringWrapper(String); - - impl ToBencode for StringWrapper { - const MAX_DEPTH: usize = 0; - - fn encode(&self, encoder: SingleItemEncoder) -> Result<(), Error> { - encoder.emit_str(&self.0) - } - } - - #[test] - fn encode_string() -> Result<(), Error> { - let example = StringWrapper("content".to_string()); - - let encoded = example.to_bencode()?; - assert_eq!(b"7:content", encoded.as_slice()); - - let encoded = "content".to_bencode()?; - assert_eq!(b"7:content", encoded.as_slice()); - - Ok(()) - } -} - -mod encoding_4 { - use bendy::encoding::{AsString, Error, SingleItemEncoder, ToBencode}; - - struct ByteStringWrapper(Vec); - - impl ToBencode for ByteStringWrapper { - const MAX_DEPTH: usize = 0; - - fn encode(&self, encoder: SingleItemEncoder) -> Result<(), Error> { - let content = AsString(&self.0); - encoder.emit(&content) - } - } - - #[test] - fn encode_byte_string() -> Result<(), Error> { - let example = ByteStringWrapper(b"content".to_vec()); - - let encoded = example.to_bencode()?; - assert_eq!(b"7:content", encoded.as_slice()); - - let encoded = AsString(b"content").to_bencode()?; - assert_eq!(b"7:content", encoded.as_slice()); - - Ok(()) - } -} - -mod encoding_5 { - use bendy::encoding::{Error, SingleItemEncoder, ToBencode}; - - struct Example { - label: String, - counter: u64, - } - - impl ToBencode for Example { - const MAX_DEPTH: usize = 1; - - fn encode(&self, encoder: SingleItemEncoder) -> Result<(), Error> { - encoder.emit_dict(|mut e| { - e.emit_pair(b"counter", &self.counter)?; - e.emit_pair(b"label", &self.label)?; - - Ok(()) - }) - } - } - - #[test] - fn encode_dictionary() -> Result<(), Error> { - let example = Example { - label: "Example".to_string(), - counter: 0, - }; - - let encoded = example.to_bencode()?; - assert_eq!(b"d7:counteri0e5:label7:Examplee", encoded.as_slice()); - - Ok(()) - } -} - -mod encoding_6 { - use bendy::encoding::{Error, SingleItemEncoder, ToBencode}; - - struct Location(i64, i64); - - impl ToBencode for Location { - const MAX_DEPTH: usize = 1; - - fn encode(&self, encoder: SingleItemEncoder) -> Result<(), Error> { - encoder.emit_list(|e| { - e.emit_int(self.0)?; - e.emit_int(self.1) - }) - } - } - - #[test] - fn encode_list() -> Result<(), Error> { - let example = Location(2, 3); - - let encoded = example.to_bencode()?; - assert_eq!(b"li2ei3ee", encoded.as_slice()); - - Ok(()) - } -} - -mod decoding_1 { - use bendy::decoding::{Error, FromBencode}; - - #[test] - fn decode_vector() -> Result<(), Error> { - let encoded = b"l5:hello5:worlde".to_vec(); - let decoded = Vec::::from_bencode(&encoded)?; - - assert_eq!(vec!["hello", "world"], decoded); - Ok(()) - } -} - -mod decoding_2 { - use bendy::decoding::{Error, FromBencode, Object}; - - #[derive(Debug, Eq, PartialEq)] - struct IntegerWrapper(i64); - - impl FromBencode for IntegerWrapper { - const EXPECTED_RECURSION_DEPTH: usize = 0; - - fn decode_bencode_object(object: Object) -> Result { - // This is an example for content handling. It would also be possible - // to call `i64::decode_bencode_object(object)` directly. - let content = object.try_into_integer()?; - let number = content.parse::()?; - - Ok(IntegerWrapper(number)) - } - } - - #[test] - fn decode_integer() -> Result<(), Error> { - let encoded = b"i21e".to_vec(); - - let example = IntegerWrapper::from_bencode(&encoded)?; - assert_eq!(IntegerWrapper(21), example); - - let example = i64::from_bencode(&encoded)?; - assert_eq!(21, example); - - Ok(()) - } -} - -mod decoding_3 { - use bendy::decoding::{Error, FromBencode, Object}; - - #[derive(Debug, Eq, PartialEq)] - struct StringWrapper(String); - - impl FromBencode for StringWrapper { - const EXPECTED_RECURSION_DEPTH: usize = 0; - - fn decode_bencode_object(object: Object) -> Result { - // This is an example for content handling. It would also be possible - // to call `String::decode_bencode_object(object)` directly. - let content = object.try_into_bytes()?; - let content = String::from_utf8(content.to_vec())?; - - Ok(StringWrapper(content)) - } - } - - #[test] - fn decode_string() -> Result<(), Error> { - let encoded = b"7:content".to_vec(); - - let example = StringWrapper::from_bencode(&encoded)?; - assert_eq!(StringWrapper("content".to_string()), example); - - let example = String::from_bencode(&encoded)?; - assert_eq!("content".to_string(), example); - - Ok(()) - } -} - -mod decoding_4 { - use bendy::{ - decoding::{Error, FromBencode, Object}, - encoding::AsString, - }; - - #[derive(Debug, Eq, PartialEq)] - struct ByteStringWrapper(Vec); - - impl FromBencode for ByteStringWrapper { - const EXPECTED_RECURSION_DEPTH: usize = 0; - - fn decode_bencode_object(object: Object) -> Result { - let content = AsString::decode_bencode_object(object)?; - Ok(ByteStringWrapper(content.0)) - } - } - - #[test] - fn decode_byte_string() -> Result<(), Error> { - let encoded = b"7:content".to_vec(); - - let example = ByteStringWrapper::from_bencode(&encoded)?; - assert_eq!(ByteStringWrapper(b"content".to_vec()), example); - - let example = AsString::from_bencode(&encoded)?; - assert_eq!(b"content".to_vec(), example.0); - - Ok(()) - } -} - -mod decoding_5 { - use bendy::decoding::{Error, FromBencode, Object, ResultExt}; - - #[derive(Debug, Eq, PartialEq)] - struct Example { - label: String, - counter: u64, - } - - impl FromBencode for Example { - const EXPECTED_RECURSION_DEPTH: usize = 1; - - fn decode_bencode_object(object: Object) -> Result { - let mut counter = None; - let mut label = None; - - let mut dict = object.try_into_dictionary()?; - while let Some(pair) = dict.next_pair()? { - match pair { - (b"counter", value) => { - counter = u64::decode_bencode_object(value) - .context("counter") - .map(Some)?; - }, - (b"label", value) => { - label = String::decode_bencode_object(value) - .context("label") - .map(Some)?; - }, - (unknown_field, _) => { - return Err(Error::unexpected_field(String::from_utf8_lossy( - unknown_field, - ))); - }, - } - } - - let counter = counter.ok_or_else(|| Error::missing_field("counter"))?; - let label = label.ok_or_else(|| Error::missing_field("label"))?; - - Ok(Example { counter, label }) - } - } - - #[test] - fn decode_dictionary() -> Result<(), Error> { - let encoded = b"d7:counteri0e5:label7:Examplee".to_vec(); - let expected = Example { - label: "Example".to_string(), - counter: 0, - }; - - let example = Example::from_bencode(&encoded)?; - assert_eq!(expected, example); - - Ok(()) - } -} - -mod decoding_6 { - use bendy::decoding::{Error, FromBencode, Object}; - - #[derive(Debug, PartialEq, Eq)] - struct Location(i64, i64); - - impl FromBencode for Location { - const EXPECTED_RECURSION_DEPTH: usize = 1; - - fn decode_bencode_object(object: Object) -> Result { - let mut list = object.try_into_list()?; - - let x = list.next_object()?.ok_or(Error::missing_field("x"))?; - let x = i64::decode_bencode_object(x)?; - - let y = list.next_object()?.ok_or(Error::missing_field("y"))?; - let y = i64::decode_bencode_object(y)?; - - Ok(Location(x, y)) - } - } - - #[test] - fn decode_list() -> Result<(), Error> { - let encoded = b"li2ei3ee".to_vec(); - let expected = Location(2, 3); - - let example = Location::from_bencode(&encoded)?; - assert_eq!(expected, example); - - Ok(()) - } -} From 63cfc9dce613876585ad05c02c23105c72c06139 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Tue, 6 Oct 2020 22:38:57 -0700 Subject: [PATCH 2/8] Make tests actually run --- README.md | 68 ++++++++++++++----------------------------------------- 1 file changed, 17 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index c9746ef..432ecc3 100644 --- a/README.md +++ b/README.md @@ -94,10 +94,7 @@ it is enough to import the trait and call the `to_bencode()` function on the obj ```rust use bendy::encoding::{ToBencode, Error}; -fn main() {} - -#[test] -fn encode_vector() -> Result<(), Error> { +fn main() -> Result<(), Error> { let my_data = vec!["hello", "world"]; let encoded = my_data.to_bencode()?; @@ -140,10 +137,7 @@ impl ToBencode for IntegerWrapper { } } -fn main() {} - -#[test] -fn encode_integer() -> Result<(), Error> { +fn main() -> Result<(), Error> { let example = IntegerWrapper(21); let encoded = example.to_bencode()?; @@ -174,10 +168,7 @@ impl ToBencode for StringWrapper { } } -fn main() {} - -#[test] -fn encode_string() -> Result<(), Error> { +fn main() -> Result<(), Error> { let example = StringWrapper("content".to_string()); let encoded = example.to_bencode()?; @@ -209,10 +200,7 @@ impl ToBencode for ByteStringWrapper { } } -fn main() {} - -#[test] -fn encode_byte_string() -> Result<(), Error> { +fn main() -> Result<(), Error> { let example = ByteStringWrapper(b"content".to_vec()); let encoded = example.to_bencode()?; @@ -258,10 +246,7 @@ impl ToBencode for Example { } } -fn main() {} - -#[test] -fn encode_dictionary() -> Result<(), Error> { +fn main() -> Result<(), Error> { let example = Example { label: "Example".to_string(), counter: 0 }; let encoded = example.to_bencode()?; @@ -293,10 +278,7 @@ impl ToBencode for Location { } } -fn main() {} - -#[test] -fn encode_list() -> Result<(), Error> { +fn main() -> Result<(), Error> { let example = Location(2, 3); let encoded = example.to_bencode()?; @@ -314,10 +296,7 @@ it is enough to import the trait and call the `from_bencode()` function on the o ```rust use bendy::decoding::{FromBencode, Error}; -fn main() {} - -#[test] -fn decode_vector() -> Result<(), Error> { +fn main() -> Result<(), Error> { let encoded = b"l5:hello5:worlde".to_vec(); let decoded = Vec::::from_bencode(&encoded)?; @@ -373,10 +352,7 @@ impl FromBencode for IntegerWrapper { } } -fn main() {} - -#[test] -fn decode_integer() -> Result<(), Error> { +fn main() -> Result<(), Error> { let encoded = b"i21e".to_vec(); let example = IntegerWrapper::from_bencode(&encoded)?; @@ -414,10 +390,7 @@ impl FromBencode for StringWrapper { } } -fn main() {} - -#[test] -fn decode_string() -> Result<(), Error> { +fn main() -> Result<(), Error> { let encoded = b"7:content".to_vec(); let example = StringWrapper::from_bencode(&encoded)?; @@ -452,10 +425,7 @@ impl FromBencode for ByteStringWrapper { } } -fn main() {} - -#[test] -fn decode_byte_string() -> Result<(), Error> { +fn main() -> Result<(), Error> { let encoded = b"7:content".to_vec(); let example = ByteStringWrapper::from_bencode(&encoded)?; @@ -522,10 +492,7 @@ impl FromBencode for Example { } } -fn main() {} - -#[test] -fn decode_dictionary() -> Result<(), Error> { +fn main() -> Result<(), Error> { let encoded = b"d7:counteri0e5:label7:Examplee".to_vec(); let expected = Example { label: "Example".to_string(), counter: 0 }; @@ -563,10 +530,7 @@ impl FromBencode for Location { } } -fn main() {} - -#[test] -fn decode_list() -> Result<(), Error> { +fn main() -> Result<(), Error> { let encoded = b"li2ei3ee".to_vec(); let expected = Location(2, 3); @@ -625,14 +589,16 @@ struct Foo { bar: String, } -fn main() { +fn main() -> bendy::serde::Result<()> { let value = Foo { bar: "hello".into(), }; - let bencode = bendy::serde::to_bytes(&value).unwrap(); + let bencode = bendy::serde::to_bytes(&value)?; assert_eq!(bencode, b"d3:bar5:helloe"); - let deserialized = bendy::serde::from_bytes::(&bencode).unwrap(); + let deserialized = bendy::serde::from_bytes::(&bencode)?; assert_eq!(deserialized, value); + + Ok(()) } ``` From 588b143bf39ba8ade8e6182326ebf571e7974218 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Tue, 6 Oct 2020 22:45:26 -0700 Subject: [PATCH 3/8] Remove fn main wrappers --- README.md | 169 +++++++++++++++++++++++------------------------------- 1 file changed, 73 insertions(+), 96 deletions(-) diff --git a/README.md b/README.md index 432ecc3..8b81491 100644 --- a/README.md +++ b/README.md @@ -94,13 +94,12 @@ it is enough to import the trait and call the `to_bencode()` function on the obj ```rust use bendy::encoding::{ToBencode, Error}; -fn main() -> Result<(), Error> { - let my_data = vec!["hello", "world"]; - let encoded = my_data.to_bencode()?; +let my_data = vec!["hello", "world"]; +let encoded = my_data.to_bencode()?; - assert_eq!(b"l5:hello5:worlde", encoded.as_slice()); - Ok(()) -} +assert_eq!(b"l5:hello5:worlde", encoded.as_slice()); + +Ok::<(), Error>(()) ``` ### Implementing `ToBencode` @@ -137,17 +136,15 @@ impl ToBencode for IntegerWrapper { } } -fn main() -> Result<(), Error> { - let example = IntegerWrapper(21); +let example = IntegerWrapper(21); - let encoded = example.to_bencode()?; - assert_eq!(b"i21e", encoded.as_slice()); +let encoded = example.to_bencode()?; +assert_eq!(b"i21e", encoded.as_slice()); - let encoded = 21.to_bencode()?; - assert_eq!(b"i21e", encoded.as_slice()); +let encoded = 21.to_bencode()?; +assert_eq!(b"i21e", encoded.as_slice()); - Ok(()) -} +Ok::<(), Error>(()) ``` **Encode a byte string** @@ -168,17 +165,15 @@ impl ToBencode for StringWrapper { } } -fn main() -> Result<(), Error> { - let example = StringWrapper("content".to_string()); +let example = StringWrapper("content".to_string()); - let encoded = example.to_bencode()?; - assert_eq!(b"7:content", encoded.as_slice()); +let encoded = example.to_bencode()?; +assert_eq!(b"7:content", encoded.as_slice()); - let encoded = "content".to_bencode()?; - assert_eq!(b"7:content", encoded.as_slice()); +let encoded = "content".to_bencode()?; +assert_eq!(b"7:content", encoded.as_slice()); - Ok(()) -} +Ok::<(), Error>(()) ``` As its a very common pattern to represent a byte string as `Vec` bendy @@ -200,17 +195,15 @@ impl ToBencode for ByteStringWrapper { } } -fn main() -> Result<(), Error> { - let example = ByteStringWrapper(b"content".to_vec()); +let example = ByteStringWrapper(b"content".to_vec()); - let encoded = example.to_bencode()?; - assert_eq!(b"7:content", encoded.as_slice()); +let encoded = example.to_bencode()?; +assert_eq!(b"7:content", encoded.as_slice()); - let encoded = AsString(b"content").to_bencode()?; - assert_eq!(b"7:content", encoded.as_slice()); +let encoded = AsString(b"content").to_bencode()?; +assert_eq!(b"7:content", encoded.as_slice()); - Ok(()) -} +Ok::<(), Error>(()) ``` **Encode a dictionary** @@ -246,14 +239,12 @@ impl ToBencode for Example { } } -fn main() -> Result<(), Error> { - let example = Example { label: "Example".to_string(), counter: 0 }; +let example = Example { label: "Example".to_string(), counter: 0 }; - let encoded = example.to_bencode()?; - assert_eq!(b"d7:counteri0e5:label7:Examplee", encoded.as_slice()); +let encoded = example.to_bencode()?; +assert_eq!(b"d7:counteri0e5:label7:Examplee", encoded.as_slice()); - Ok(()) -} +Ok::<(), Error>(()) ``` **Encode a list** @@ -278,14 +269,12 @@ impl ToBencode for Location { } } -fn main() -> Result<(), Error> { - let example = Location(2, 3); +let example = Location(2, 3); - let encoded = example.to_bencode()?; - assert_eq!(b"li2ei3ee", encoded.as_slice()); +let encoded = example.to_bencode()?; +assert_eq!(b"li2ei3ee", encoded.as_slice()); - Ok(()) -} +Ok::<(), Error>(()) ``` ### Decoding with `FromBencode` @@ -296,14 +285,12 @@ it is enough to import the trait and call the `from_bencode()` function on the o ```rust use bendy::decoding::{FromBencode, Error}; -fn main() -> Result<(), Error> { - let encoded = b"l5:hello5:worlde".to_vec(); - let decoded = Vec::::from_bencode(&encoded)?; +let encoded = b"l5:hello5:worlde".to_vec(); +let decoded = Vec::::from_bencode(&encoded)?; - assert_eq!(vec!["hello", "world"], decoded); - Ok(()) -} +assert_eq!(vec!["hello", "world"], decoded); +Ok::<(), Error>(()) ``` ### Implementing `FromBencode` @@ -352,17 +339,15 @@ impl FromBencode for IntegerWrapper { } } -fn main() -> Result<(), Error> { - let encoded = b"i21e".to_vec(); +let encoded = b"i21e".to_vec(); - let example = IntegerWrapper::from_bencode(&encoded)?; - assert_eq!(IntegerWrapper(21), example); +let example = IntegerWrapper::from_bencode(&encoded)?; +assert_eq!(IntegerWrapper(21), example); - let example = i64::from_bencode(&encoded)?; - assert_eq!(21, example); +let example = i64::from_bencode(&encoded)?; +assert_eq!(21, example); - Ok(()) -} +Ok::<(), Error>(()) ``` **Decode a byte string** @@ -390,17 +375,15 @@ impl FromBencode for StringWrapper { } } -fn main() -> Result<(), Error> { - let encoded = b"7:content".to_vec(); +let encoded = b"7:content".to_vec(); - let example = StringWrapper::from_bencode(&encoded)?; - assert_eq!(StringWrapper("content".to_string()), example); +let example = StringWrapper::from_bencode(&encoded)?; +assert_eq!(StringWrapper("content".to_string()), example); - let example = String::from_bencode(&encoded)?; - assert_eq!("content".to_string(), example); +let example = String::from_bencode(&encoded)?; +assert_eq!("content".to_string(), example); - Ok(()) -} +Ok::<(), Error>(()) ``` If the content is a non utf8 encoded string or an actual byte sequence the @@ -425,17 +408,15 @@ impl FromBencode for ByteStringWrapper { } } -fn main() -> Result<(), Error> { - let encoded = b"7:content".to_vec(); +let encoded = b"7:content".to_vec(); - let example = ByteStringWrapper::from_bencode(&encoded)?; - assert_eq!(ByteStringWrapper(b"content".to_vec()), example); +let example = ByteStringWrapper::from_bencode(&encoded)?; +assert_eq!(ByteStringWrapper(b"content".to_vec()), example); - let example = AsString::from_bencode(&encoded)?; - assert_eq!(b"content".to_vec(), example.0); +let example = AsString::from_bencode(&encoded)?; +assert_eq!(b"content".to_vec(), example.0); - Ok(()) -} +Ok::<(), Error>(()) ``` **Decode a dictionary** @@ -492,15 +473,13 @@ impl FromBencode for Example { } } -fn main() -> Result<(), Error> { - let encoded = b"d7:counteri0e5:label7:Examplee".to_vec(); - let expected = Example { label: "Example".to_string(), counter: 0 }; +let encoded = b"d7:counteri0e5:label7:Examplee".to_vec(); +let expected = Example { label: "Example".to_string(), counter: 0 }; - let example = Example::from_bencode(&encoded)?; - assert_eq!(expected, example); +let example = Example::from_bencode(&encoded)?; +assert_eq!(expected, example); - Ok(()) -} +Ok::<(), Error>(()) ``` **Decode a list** @@ -530,15 +509,13 @@ impl FromBencode for Location { } } -fn main() -> Result<(), Error> { - let encoded = b"li2ei3ee".to_vec(); - let expected = Location(2, 3); +let encoded = b"li2ei3ee".to_vec(); +let expected = Location(2, 3); - let example = Location::from_bencode(&encoded)?; - assert_eq!(expected, example); +let example = Location::from_bencode(&encoded)?; +assert_eq!(expected, example); - Ok(()) -} +Ok::<(), Error>(()) ``` ### Optional: Limitation of recursive parsing @@ -589,17 +566,17 @@ struct Foo { bar: String, } -fn main() -> bendy::serde::Result<()> { - let value = Foo { - bar: "hello".into(), - }; - let bencode = bendy::serde::to_bytes(&value)?; - assert_eq!(bencode, b"d3:bar5:helloe"); - let deserialized = bendy::serde::from_bytes::(&bencode)?; - assert_eq!(deserialized, value); +let value = Foo { + bar: "hello".into(), +}; - Ok(()) -} +let bencode = bendy::serde::to_bytes(&value)?; +assert_eq!(bencode, b"d3:bar5:helloe"); + +let deserialized = bendy::serde::from_bytes::(&bencode)?; +assert_eq!(deserialized, value); + +Ok::<(), bendy::serde::Error>(()) ``` Information on how Rust types are represented in bencode is available in the From 5ea572d533314c4e2baa39a815535fd9f8aadbb9 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Mon, 16 Nov 2020 15:18:40 -0800 Subject: [PATCH 4/8] Enable doctests only if rust version >= 1.40 --- Cargo.toml | 1 + src/lib.rs | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index efa8424..7705b45 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,6 +39,7 @@ serde_bytes = { version = "^0.11.3", optional = true } [dev-dependencies] doc-comment = "0.3.3" regex = "^1.0" +rustversion = "1.0.4" serde_derive = "^1.0" ### FEATURES ################################################################### diff --git a/src/lib.rs b/src/lib.rs index 22a9c7b..49061d8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -23,4 +23,8 @@ pub mod serde; pub mod value; #[cfg(doctest)] -doc_comment::doctest!("../README.md"); +#[rustversion::since(1.40)] +mod doctest { + use super::*; + doc_comment::doctest!("../README.md"); +} From ed4d3979a3129fead0f5246ea4ceb086a496976f Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Mon, 16 Nov 2020 15:18:59 -0800 Subject: [PATCH 5/8] Disable serde-dependent doctests if serde not available --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8b81491..1353838 100644 --- a/README.md +++ b/README.md @@ -558,6 +558,9 @@ respectively: ```rust +# #[cfg(feature = "serde")] +# fn main() -> Result<(), bendy::serde::Error> { + use serde_derive::{Deserialize, Serialize}; #[serde(crate = "serde_")] @@ -576,7 +579,9 @@ assert_eq!(bencode, b"d3:bar5:helloe"); let deserialized = bendy::serde::from_bytes::(&bencode)?; assert_eq!(deserialized, value); -Ok::<(), bendy::serde::Error>(()) +Ok(()) + +# } ``` Information on how Rust types are represented in bencode is available in the From d45d8f204aaf839615ff79892c063449479dc3e0 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Mon, 16 Nov 2020 15:20:58 -0800 Subject: [PATCH 6/8] Fix doctest when serde isn't available --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 1353838..08db258 100644 --- a/README.md +++ b/README.md @@ -558,6 +558,8 @@ respectively: ```rust +# #[cfg(not(feature = "serde"))] +# fn main() {} # #[cfg(feature = "serde")] # fn main() -> Result<(), bendy::serde::Error> { From a245df031718a68b58c6a1926e8bbc8e096d1b00 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Wed, 18 Nov 2020 17:34:54 -0800 Subject: [PATCH 7/8] Fix doctest error --- Cargo.toml | 2 +- src/lib.rs | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7705b45..9005ea3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,11 +35,11 @@ codegen-units = 1 failure = { version = "^0.1.3", default_features = false, features = ["derive"] } serde_ = { version = "^1.0" , optional = true, package = "serde" } serde_bytes = { version = "^0.11.3", optional = true } +rustversion = "1.0.4" [dev-dependencies] doc-comment = "0.3.3" regex = "^1.0" -rustversion = "1.0.4" serde_derive = "^1.0" ### FEATURES ################################################################### diff --git a/src/lib.rs b/src/lib.rs index 49061d8..b6e554d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,9 +22,8 @@ pub mod serde; pub mod value; -#[cfg(doctest)] #[rustversion::since(1.40)] -mod doctest { - use super::*; - doc_comment::doctest!("../README.md"); -} +const _: () = { + #[cfg(doctest)] + doc_comment::doctest!("../README.md"); +}; From d576851de59a248587a6e717666c93d86ba7876d Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Wed, 18 Nov 2020 17:47:04 -0800 Subject: [PATCH 8/8] Remove rustfmt required version --- rustfmt.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/rustfmt.toml b/rustfmt.toml index 49e0f5f..9619212 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1,6 +1,5 @@ unstable_features = true -required_version = "1.4.22" edition = "2018" format_code_in_doc_comments = true