assembly 0.4.1

Library for files/resources for LU related software
Documentation
extern crate getopts;
use std::io::{BufReader, Error as IoError};
use std::fs::File;
use assembly::fdb::core::{Field};
use assembly::fdb::io::{SchemaLoader, LoaderConfigImpl, LoadError};
use assembly::fdb::sysdiagram::core::SysDiagram;
use assembly::fdb::sysdiagram::io::LoadError as SysDiagramError;
use std::convert::TryFrom;
use getopts::Options;


#[derive(Debug)]
pub enum MainError {
    Io(IoError),
    Load(LoadError),
    SysDiagram(SysDiagramError),
    TableNotFound,
}

impl From<IoError> for MainError {
    fn from(e: IoError) -> Self {
        MainError::Io(e)
    }
}

impl From<LoadError> for MainError {
    fn from(e: LoadError) -> Self {
        MainError::Load(e)
    }
}

impl From<SysDiagramError> for MainError {
    fn from(e: SysDiagramError) -> Self {
        MainError::SysDiagram(e)
    }
}

fn load_database(filename: &str) -> Result<(), MainError> {
    println!("Loading tables... (this may take a while)");
    let file = File::open(filename)?;
    let mut reader = BufReader::new(file);
    let config = LoaderConfigImpl {
        table_data_policy: |def| def.name == "sysdiagrams",
    };
    let mut loader = SchemaLoader::open(&mut reader, config);
    let schema = loader.try_load_schema()?;

    match schema.table("sysdiagrams") {
        Some(table) => {
            for row in table {
                match &row.fields_ref()[4] {
                    Field::Text(text) => {
                        let sysdiagram = SysDiagram::try_from(&text[..])?;
                        println!("{:?}", sysdiagram);
                    },
                    data => println!("Wrong data: {:?}", data),
                }
            }
            Ok(())
        },
        None => Err(MainError::TableNotFound),
    }
}

fn print_usage(program: &str, opts: Options) {
    let brief = format!("Usage: {} FILE [options]", program);
    print!("{}", opts.usage(&brief));
}

pub fn main(args: Vec<String>) -> Result<(), MainError> {
    let program = args[0].clone();

    let mut opts = Options::new();
    opts.optflag("h", "help", "print this help menu");
    let matches = match opts.parse(&args[1..]) {
        Ok(m) => { m }
        Err(f) => { panic!(f.to_string()) }
    };
    if matches.opt_present("h") {
        print_usage(&program, opts);
        return Ok(());
    }
    let input = if !matches.free.is_empty() {
        matches.free[0].clone()
    } else {
        print_usage(&program, opts);
        return Ok(());
    };
    load_database(&input)
}