Skip to content

Commit 6f196e3

Browse files
committed
feat(bin): add binary serialisation
1 parent 38e135c commit 6f196e3

File tree

3 files changed

+69
-25
lines changed

3 files changed

+69
-25
lines changed

Cargo.lock

Lines changed: 31 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cambridge-asm-cli/Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@ cambridge = ["cambridge-asm/cambridge"]
1717

1818
[dependencies]
1919
env_logger = "0.9"
20-
cambridge-asm = "0.11"
20+
cambridge-asm = "0.12"
2121
serde_json = "1"
2222
ron = "0.6"
2323
serde_yaml = "0.8"
2424

25+
[dependencies.bincode]
26+
version = "2.0.0-rc.1"
27+
2528
[dependencies.clap]
2629
version = "3.0"
2730
features = ["derive"]

cambridge-asm-cli/src/main.rs

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -81,13 +81,15 @@ enum InFormats {
8181
Json,
8282
Ron,
8383
Yaml,
84+
Bin,
8485
}
8586

8687
#[derive(ArgEnum, Clone)]
8788
enum OutFormats {
8889
Json,
8990
Ron,
9091
Yaml,
92+
Bin,
9193
}
9294

9395
#[allow(clippy::enum_glob_use)]
@@ -106,35 +108,41 @@ fn main() -> std::io::Result<()> {
106108
} => {
107109
use InFormats::*;
108110

109-
let parser: Box<dyn FnOnce(String, InstSet) -> Executor> = match format {
110-
Pasm => Box::new(|s, set| parse::parse(s, set)),
111-
Json => Box::new(|s, set| {
112-
serde_json::from_str::<CompiledProg>(&s)
111+
let parser: Box<dyn FnOnce(Vec<u8>, InstSet) -> Executor> = match format {
112+
Pasm => Box::new(|v, set| parse::parse(String::from_utf8_lossy(&v), set)),
113+
Json => Box::new(|v, set| {
114+
serde_json::from_str::<CompiledProg>(&String::from_utf8_lossy(&v))
113115
.unwrap()
114116
.to_executor(set)
115117
}),
116-
Ron => {
117-
Box::new(|s, set| ron::from_str::<CompiledProg>(&s).unwrap().to_executor(set))
118-
}
119-
Yaml => Box::new(|s, set| {
120-
serde_yaml::from_str::<CompiledProg>(&s)
118+
Ron => Box::new(|v, set| {
119+
ron::from_str::<CompiledProg>(&String::from_utf8_lossy(&v))
121120
.unwrap()
122121
.to_executor(set)
123122
}),
123+
Yaml => Box::new(|v, set| {
124+
serde_yaml::from_str::<CompiledProg>(&String::from_utf8_lossy(&v))
125+
.unwrap()
126+
.to_executor(set)
127+
}),
128+
Bin => Box::new(|v, set| {
129+
bincode::decode_from_slice::<CompiledProg, _>(&v, bincode::config::standard())
130+
.unwrap()
131+
.0
132+
.to_executor(set)
133+
}),
124134
};
125135

126136
init_logger(verbosity);
127-
let prog = std::fs::read_to_string(path)?;
128-
137+
let prog_bytes = std::fs::read(path)?;
129138
let mut timer = bench.then(std::time::Instant::now);
130139

131-
let mut executor = parser(prog, INST_SET);
140+
let mut executor = parser(prog_bytes, INST_SET);
132141

133142
timer = timer.map(|t| {
134143
println!("Total parse time: {:?}", t.elapsed());
135144
std::time::Instant::now()
136145
});
137-
138146
if timer.is_some() || verbosity > 0 {
139147
println!("Execution starts on next line");
140148
}
@@ -152,26 +160,31 @@ fn main() -> std::io::Result<()> {
152160
} => {
153161
use OutFormats::*;
154162

155-
let serializer: Box<dyn FnOnce(CompiledProg) -> String> = match format {
163+
let serializer: Box<dyn FnOnce(CompiledProg) -> Vec<u8>> = match format {
156164
Json => Box::new(|prog| {
157165
use serde_json::ser::{to_string, to_string_pretty};
158166

159-
if minify {
167+
(if minify {
160168
to_string(&prog).unwrap()
161169
} else {
162170
to_string_pretty(&prog).unwrap()
163-
}
171+
})
172+
.into_bytes()
164173
}),
165174
Ron => Box::new(|prog| {
166175
use ron::ser::{to_string, to_string_pretty, PrettyConfig};
167176

168-
if minify {
177+
(if minify {
169178
to_string(&prog).unwrap()
170179
} else {
171180
to_string_pretty(&prog, PrettyConfig::default()).unwrap()
172-
}
181+
})
182+
.into_bytes()
183+
}),
184+
Yaml => Box::new(|prog| serde_yaml::to_string(&prog).unwrap().into_bytes()),
185+
Bin => Box::new(|prog| {
186+
bincode::encode_to_vec(&prog, bincode::config::standard()).unwrap()
173187
}),
174-
Yaml => Box::new(|prog| serde_yaml::to_string(&prog).unwrap()),
175188
};
176189

177190
init_logger(verbosity);
@@ -183,11 +196,12 @@ fn main() -> std::io::Result<()> {
183196
Json => ".json",
184197
Ron => ".ron",
185198
Yaml => ".yaml",
199+
Bin => ".bin",
186200
});
187201
input
188202
});
189203

190-
std::fs::write(output, serializer(compiled))?;
204+
std::fs::write(output, &*serializer(compiled))?;
191205
}
192206
}
193207

0 commit comments

Comments
 (0)