diff options
Diffstat (limited to 'README.md')
-rw-r--r-- | README.md | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/README.md b/README.md new file mode 100644 index 0000000..8b928a8 --- /dev/null +++ b/README.md @@ -0,0 +1,64 @@ +## XML-Stinks +Powerful, fast & easy manual XML deserialization using abstractions over [quick-xml](https://github.com/tafia/quick-xml). + +## Example usage +```rust +use std::convert::Infallible; + +use xml_stinks::deserializer::buffered::Buffered as BufferedDeserializer; +use xml_stinks::deserializer::{Deserializer, IgnoreEnd}; +use xml_stinks::tagged::TagStart; +use xml_stinks::DeserializeTagged; + +let mut deserializer = + BufferedDeserializer::new("<foo>Baz<bar>DF</bar></foo>".as_bytes()); + +let foo = deserializer.de_tag::<Foo>("foo", IgnoreEnd::No).unwrap(); + +assert_eq!(&foo.name, "Baz"); +assert_eq!(foo.bar.num, 223); + +struct Foo +{ + name: String, + bar: Bar, +} + +impl DeserializeTagged for Foo +{ + type Error = Infallible; + + fn deserialize<TDeserializer: Deserializer>( + start: &TagStart, + deserializer: &mut TDeserializer, + ) -> Result<Self, Self::Error> + { + let name = deserializer.de_text().unwrap(); + + let bar = deserializer.de_tag::<Bar>("bar", IgnoreEnd::No).unwrap(); + + Ok(Self { name, bar }) + } +} + +struct Bar +{ + num: u32, +} + +impl DeserializeTagged for Bar +{ + type Error = Infallible; + + fn deserialize<TDeserializer: Deserializer>( + start: &TagStart, + deserializer: &mut TDeserializer, + ) -> Result<Self, Self::Error> + { + let num = u32::from_str_radix(&deserializer.de_text().unwrap(), 16).unwrap(); + + Ok(Self { num }) + } +} +``` + |