use redis_parser::resp2::parse as parse2;
use redis_parser::resp3::parse as parse3;
use clap::arg_enum;
use std::path::PathBuf;
use structopt::StructOpt;
arg_enum! {
#[derive(Debug)]
enum RespType {
RESP2,
RESP3,
}
}
#[derive(Debug, StructOpt)]
#[structopt(name = "print_resp", about = "Print RESP output.")]
struct Opt {
#[structopt(parse(from_os_str))]
input: PathBuf,
#[structopt(short, long, possible_values = & RespType::variants(), case_insensitive = true, default_value = "resp2")]
version: RespType,
}
fn main() {
let args: Opt = Opt::from_args();
let raw_text = std::fs::read_to_string(args.input).expect("File does not exist");
let replaced = raw_text.replace('\n', "\r\n");
let mut data = replaced.as_bytes();
match args.version {
RespType::RESP2 => {
let it = std::iter::from_fn(move || match parse2(data) {
Ok((i, o)) => {
data = i;
Some(o)
}
_ => None,
});
for item in it {
println!("{:?}", item);
}
}
RespType::RESP3 => {
let it = std::iter::from_fn(move || match parse3(data) {
Ok((i, o)) => {
data = i;
Some(o)
}
_ => None,
});
for item in it {
println!("{:?}", item);
}
}
};
}