use mediawiki_parser;
use serde_json;
use serde_yaml;
use std::fs;
use std::io;
use std::io::prelude::*;
use std::io::BufReader;
use std::path::PathBuf;
use std::process;
use structopt::StructOpt;
#[derive(Debug, StructOpt)]
struct Args {
#[structopt(short = "i", long = "input", parse(from_os_str))]
pub input_file: Option<PathBuf>,
#[structopt(short = "j", long = "json")]
pub use_json: bool,
}
fn read_from_reader(reader: &mut io::Read) -> String {
let mut buffer = io::BufReader::new(reader);
let mut content = String::new();
buffer
.read_to_string(&mut content)
.expect("Could not read fron file!");
content
}
fn read_file(filename: &PathBuf) -> String {
let file = fs::File::open(filename).expect("Could not open file!");
let mut reader = BufReader::new(file);
read_from_reader(&mut reader)
}
fn read_stdin() -> String {
read_from_reader(&mut io::stdin())
}
fn main() {
let args = Args::from_args();
let input = if let Some(path) = args.input_file {
read_file(&path)
} else {
read_stdin()
};
let result = mediawiki_parser::parse(&input);
match result {
Ok(r) => {
if args.use_json {
serde_json::to_writer(io::stdout(), &r).expect("could not serialize json!");
} else {
serde_yaml::to_writer(io::stdout(), &r).expect("could not serialize yaml!");
};
println!();
}
Err(e) => {
eprintln!("{}", e);
if args.use_json {
serde_json::to_writer(io::stdout(), &e).expect("could not serialize json!");
} else {
serde_yaml::to_writer(io::stdout(), &e).expect("could not serialize yaml!");
};
println!();
process::exit(1);
}
};
}