use std::fs::File;
use std::io::prelude::*;
use clap::Parser;
#[derive(Parser)]
#[clap(
version = "1.1.1",
author = "James Harrison <james@talkunafraid.co.uk>",
about = "otdrs is a conversion utility to convert Telcordia SOR files, used by optical time-domain reflectometry testers, into open formats such as JSON"
)]
struct Opts {
#[clap(index = 1, required = true)]
input_filename: String,
#[clap(short, long, default_value = "json")]
format: String,
#[clap(short, long, default_value = "stdout")]
output_filename: String,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let opts: Opts = Opts::parse();
let mut file = File::open(opts.input_filename)?;
let mut buffer = Vec::new();
file.read_to_end(&mut buffer)?;
let parser = otdrs::parser::parse_file(buffer.as_slice());
let res = parser.unwrap().1;
let out;
if opts.format == "json" {
out = (&serde_json::to_vec(&res).unwrap()).to_owned();
} else if opts.format == "cbor" {
out = (&serde_cbor::to_vec(&res).unwrap()).to_owned();
} else {
panic!("Unimplemented output format");
}
if opts.output_filename == "stdout" {
let stdout = std::io::stdout();
let mut handle = stdout.lock();
handle.write_all(&out)?;
} else {
let mut output_file = File::create(opts.output_filename).unwrap();
output_file.write_all(&out)?;
}
Ok(())
}