serval 0.1.0

An experimental Web browser engine
Documentation
use failure;
use loggerv;
use serval;

use std::fs;
use std::io::prelude::*;
use structopt::StructOpt;

type Result<T> = std::result::Result<T, failure::Error>;

#[derive(StructOpt, Debug)]
struct Opt {
    #[structopt(short = "v", parse(from_occurrences))]
    verbose: u64,
    #[structopt(subcommand)]
    cmd: Command,
}

#[derive(StructOpt, Debug)]
enum Command {
    #[structopt(name = "parse-html")]
    ParseHtml { html: String },
    #[structopt(name = "layout")]
    Layout { html: String, stylesheet: String },
    #[structopt(name = "paint")]
    Paint {
        html: String,
        stylesheet: String,
        output_file: String,
        #[structopt(name = "format")]
        format: String,
    },
}

fn main() -> Result<()> {
    let opt = Opt::from_args();
    loggerv::init_with_verbosity(opt.verbose).unwrap();
    match opt.cmd {
        Command::ParseHtml { html } => {
            let mut f = fs::File::open(html)?;
            let mut s = String::new();
            f.read_to_string(&mut s)?;
            println!("{:#}", serval::parse_html(&s)?);
        }
        Command::Layout { html, stylesheet } => {
            let mut f = fs::File::open(html)?;
            let mut html = String::new();
            f.read_to_string(&mut html)?;

            let mut f = fs::File::open(stylesheet)?;
            let mut stylesheet = String::new();
            f.read_to_string(&mut stylesheet)?;
            println!("{}", serval::dump_layout(&html, &stylesheet)?);
        }
        Command::Paint {
            html,
            stylesheet,
            output_file,
            format,
        } => {
            let mut f = fs::File::open(html)?;
            let mut html = String::new();
            f.read_to_string(&mut html)?;
            let mut f = fs::File::open(stylesheet)?;
            let mut stylesheet = String::new();
            f.read_to_string(&mut stylesheet)?;
            serval::paint_and_save(&html, &stylesheet, output_file, &format)?;
        }
    }
    Ok(())
}