Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/cranelift/serde/src/clif-json.rs
1691 views
1
//! Utility for `cranelift_serde`.
2
3
#![deny(missing_docs)]
4
5
use clap::Parser;
6
use cranelift_codegen::ir::Function;
7
use cranelift_reader::parse_functions;
8
use std::fs::File;
9
use std::io;
10
use std::io::prelude::*;
11
use std::process;
12
13
fn call_ser(file: &str, pretty: bool) -> Result<(), String> {
14
let ret_of_parse = parse_functions(file);
15
match ret_of_parse {
16
Ok(funcs) => {
17
let ser_str = if pretty {
18
serde_json::to_string_pretty(&funcs).unwrap()
19
} else {
20
serde_json::to_string(&funcs).unwrap()
21
};
22
println!("{ser_str}");
23
Ok(())
24
}
25
Err(_pe) => Err("There was a parsing error".to_string()),
26
}
27
}
28
29
fn call_de(file: &File) -> Result<(), String> {
30
let de: Vec<Function> = match serde_json::from_reader(file) {
31
Result::Ok(val) => val,
32
Result::Err(err) => panic!("{}", err),
33
};
34
println!("{de:?}");
35
Ok(())
36
}
37
38
/// Cranelift JSON serializer/deserializer utility
39
#[derive(Parser, Debug)]
40
#[command(about)]
41
enum Args {
42
/// Serializes Cranelift IR into JSON
43
Serialize {
44
/// Generate pretty json
45
#[arg(long, short)]
46
pretty: bool,
47
48
/// Input file for serialization
49
file: String,
50
},
51
/// Deserializes Cranelift IR into JSON
52
Deserialize {
53
/// Input file for deserialization
54
file: String,
55
},
56
}
57
58
fn main() {
59
let res_serde = match Args::parse() {
60
Args::Serialize { pretty, file } => {
61
let mut contents = String::new();
62
let mut file = File::open(file).expect("Unable to open the file");
63
file.read_to_string(&mut contents)
64
.expect("Unable to read the file");
65
66
call_ser(&contents, pretty)
67
}
68
Args::Deserialize { file } => {
69
let file = File::open(file).expect("Unable to open the file");
70
call_de(&file)
71
}
72
};
73
74
if let Err(mut msg) = res_serde {
75
if !msg.ends_with('\n') {
76
msg.push('\n');
77
}
78
io::stdout().flush().expect("flushing stdout");
79
io::stderr().write_all(msg.as_bytes()).unwrap();
80
process::exit(1);
81
}
82
}
83
84