fn print_err(msg_id: &str, err: &str) {
println!(r#"{{"msgId":"{msg_id}","error":"{err}"}}"#);
}
fn print_sig(msg_id: &str) {
println!(
r#"{{"msgId":"{msg_id}","signature":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="}}"#
);
}
fn main() {
use std::io::BufRead;
let mut test: Box<dyn FnMut(&str)> =
match std::env::args().nth(1).unwrap().as_str() {
"alternate" => {
let mut bad = false;
Box::new(move |msg_id: &str| {
if bad {
bad = false;
print_err(msg_id, "internal");
} else {
bad = true;
print_sig(msg_id);
}
})
}
"one_and_done" => {
Box::new(|msg_id: &str| {
print_sig(msg_id);
std::process::exit(0);
})
}
"never_3" => {
let mut r_count = 0;
Box::new(move |_msg_id: &str| {
r_count += 1;
if r_count >= 3 {
std::process::exit(0);
}
})
}
oth => panic!("invalid test: '{}'", oth),
};
let stdin = std::io::stdin();
for line in stdin.lock().lines() {
let line = line.unwrap();
let parsed: serde_json::Value = serde_json::from_str(&line).unwrap();
let msg_id = parsed
.as_object()
.unwrap()
.get("msgId")
.unwrap()
.as_str()
.unwrap();
test(msg_id);
}
}