From eb088aa4911f5b450c2ca74a2f00bfe8f47d4202 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Fri, 29 May 2020 11:08:12 +0200 Subject: [PATCH] Experimentation with extensibility, such as it is --- implementations/rust/examples/Makefile | 10 ++++ .../rust/examples/extensibility.rs | 53 +++++++++++++++++++ implementations/rust/examples/known-data.bin | 1 + implementations/rust/examples/known-data.txt | 7 +++ .../rust/examples/unknown-data.bin | 1 + .../rust/examples/unknown-data.txt | 8 +++ 6 files changed, 80 insertions(+) create mode 100644 implementations/rust/examples/Makefile create mode 100644 implementations/rust/examples/extensibility.rs create mode 100644 implementations/rust/examples/known-data.bin create mode 100644 implementations/rust/examples/known-data.txt create mode 100644 implementations/rust/examples/unknown-data.bin create mode 100644 implementations/rust/examples/unknown-data.txt diff --git a/implementations/rust/examples/Makefile b/implementations/rust/examples/Makefile new file mode 100644 index 0000000..943d1e9 --- /dev/null +++ b/implementations/rust/examples/Makefile @@ -0,0 +1,10 @@ +BINARY_FILES=known-data.bin unknown-data.bin + +all: $(BINARY_FILES) + +%.bin: %.txt Makefile + racket ../../racket/preserves/preserves/tool.rkt --atob --no-annotations < $< > $@.tmp || (rm -f $@.tmp; false) + mv $@.tmp $@ + +clean: + rm -f $(BINARY_FILES) diff --git a/implementations/rust/examples/extensibility.rs b/implementations/rust/examples/extensibility.rs new file mode 100644 index 0000000..6e3aae6 --- /dev/null +++ b/implementations/rust/examples/extensibility.rs @@ -0,0 +1,53 @@ +use preserves::{de, value, value::decoder}; +use serde::{Serialize, Deserialize}; +use std::fs::File; +use std::io::Error; + +#[derive(Debug, Serialize, Deserialize, PartialEq)] +enum Fruit { + Apple(Colour), + Pear(Variety), + Banana(Weight, Colour, u8), + + // Peach, + + #[serde(other)] + Unknown, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename = "kilograms")] +struct Weight(f32); + +#[derive(Debug, Serialize, Deserialize, PartialEq)] +struct Colour { + name: String, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq)] +enum Variety { + Conference, + Bosc, + European, + Anjou, +} + +fn try_file(kind: &str, path: &str) -> Result<(), Error> { + let fruits_value = decoder::from_read(&mut File::open(path)?).demand_next()?; + println!("{:?}", fruits_value); + + let fruits1: Vec = value::de::from_value(&fruits_value)?; + println!("(via generic decoding) {}: {:?}", kind, fruits1); + + let fruits2: Vec = de::from_read(&mut File::open(path)?)?; + println!("(direct from binary) {}: {:?}\n", kind, fruits2); + + assert_eq!(fruits1, fruits2); + Ok(()) +} + +fn main() -> Result<(), Error> { + try_file("KNOWN", "examples/known-data.bin")?; + try_file("UNKNOWN", "examples/unknown-data.bin")?; + Ok(()) +} diff --git a/implementations/rust/examples/known-data.bin b/implementations/rust/examples/known-data.bin new file mode 100644 index 0000000..d7173a3 --- /dev/null +++ b/implementations/rust/examples/known-data.bin @@ -0,0 +1 @@ +”‚uApple‚vColourSred‚uApple‚vColourUgreen„vBanana‚ykilograms?ž¸Që…¸‚vColourXbrownish5‚tPearzConference \ No newline at end of file diff --git a/implementations/rust/examples/known-data.txt b/implementations/rust/examples/known-data.txt new file mode 100644 index 0000000..96ed208 --- /dev/null +++ b/implementations/rust/examples/known-data.txt @@ -0,0 +1,7 @@ +@ +[ + > + > + 5> + > +] diff --git a/implementations/rust/examples/unknown-data.bin b/implementations/rust/examples/unknown-data.bin new file mode 100644 index 0000000..233fcbb --- /dev/null +++ b/implementations/rust/examples/unknown-data.bin @@ -0,0 +1 @@ +•‚uApple‚vColourSreduPeach‚uApple‚vColourUgreen…vBanana‚ykilograms?ž¸Që…¸‚vColourXbrownish5˛xripenesswSquishy‚tPearzConference \ No newline at end of file diff --git a/implementations/rust/examples/unknown-data.txt b/implementations/rust/examples/unknown-data.txt new file mode 100644 index 0000000..fce3d3a --- /dev/null +++ b/implementations/rust/examples/unknown-data.txt @@ -0,0 +1,8 @@ +@ +[ + > + + > + 5 {ripeness: }> + > +]