Experimentation with extensibility, such as it is

This commit is contained in:
Tony Garnock-Jones 2020-05-29 11:08:12 +02:00
parent 22b76cb9b6
commit eb088aa491
6 changed files with 80 additions and 0 deletions

View File

@ -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)

View File

@ -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<Fruit> = value::de::from_value(&fruits_value)?;
println!("(via generic decoding) {}: {:?}", kind, fruits1);
let fruits2: Vec<Fruit> = 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(())
}

View File

@ -0,0 +1 @@
uApplevColourSreduApplevColourUgreen„vBananaykilograms¸Që…¸vColourXbrownish5tPear<61>zConference

View File

@ -0,0 +1,7 @@
@<EmacsMode "-*- preserves -*-">
[
<Apple <Colour "red">>
<Apple <Colour "green">>
<Banana <kilograms 0.12> <Colour "brownish"> 5>
<Pear <Conference>>
]

View File

@ -0,0 +1 @@
浮uAppleColourSred「PeachAppleColourUgreen<EFBFBD>Bananakilograms?セクQ<EFBDB8>ColourXbrownish5イxripeness『SquishyPear】Conference

View File

@ -0,0 +1,8 @@
@<EmacsMode "-*- preserves -*-">
[
<Apple <Colour "red">>
<Peach>
<Apple <Colour "green">>
<Banana <kilograms 0.12> <Colour "brownish"> 5 {ripeness: <Squishy>}>
<Pear <Conference>>
]