Experimentation with extensibility, such as it is
This commit is contained in:
parent
22b76cb9b6
commit
eb088aa491
|
@ -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)
|
|
@ -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(())
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
”‚uApple‚vColourSred‚uApple‚vColourUgreen„vBanana‚ykilograms?¾¸Që…¸‚vColourXbrownish5‚tPear<61>zConference
|
|
@ -0,0 +1,7 @@
|
||||||
|
@<EmacsMode "-*- preserves -*-">
|
||||||
|
[
|
||||||
|
<Apple <Colour "red">>
|
||||||
|
<Apple <Colour "green">>
|
||||||
|
<Banana <kilograms 0.12> <Colour "brownish"> 5>
|
||||||
|
<Pear <Conference>>
|
||||||
|
]
|
|
@ -0,0 +1 @@
|
||||||
|
浮uAppleWColourSred「PeachVAppleWColourUgreen<EFBFBD>BananaZkilograms?セクQ<EFBDB8>クWColourXbrownish5イxripeness『SquishyUPear】Conference
|
|
@ -0,0 +1,8 @@
|
||||||
|
@<EmacsMode "-*- preserves -*-">
|
||||||
|
[
|
||||||
|
<Apple <Colour "red">>
|
||||||
|
<Peach>
|
||||||
|
<Apple <Colour "green">>
|
||||||
|
<Banana <kilograms 0.12> <Colour "brownish"> 5 {ripeness: <Squishy>}>
|
||||||
|
<Pear <Conference>>
|
||||||
|
]
|
Loading…
Reference in New Issue