#![recursion_limit = "128"]
use common_failures::quick_main;
use failure::Error;
use futures::FutureExt;
use std::{path::PathBuf, result};
use structopt::StructOpt;
mod addresses;
mod async_util;
mod geocoder;
mod smartystreets;
mod structure;
mod unpack_vec;
use addresses::AddressColumnSpec;
use geocoder::{geocode_stdio, OnDuplicateColumns};
use smartystreets::MatchStrategy;
use structure::Structure;
type Result<T> = result::Result<T, Error>;
#[derive(Debug, StructOpt)]
#[structopt(about = "geocode CSV files passed on standard input")]
struct Opt {
#[structopt(long = "match", default_value = "strict")]
match_strategy: MatchStrategy,
#[structopt(long = "duplicate-columns", default_value = "error")]
on_duplicate_columns: OnDuplicateColumns,
#[structopt(long = "spec")]
spec_path: PathBuf,
#[structopt(long = "license", default_value = "us-standard-cloud")]
license: String,
}
quick_main!(run);
fn run() -> Result<()> {
env_logger::init();
let opt = Opt::from_args();
let spec = AddressColumnSpec::from_path(&opt.spec_path)?;
let structure = Structure::complete()?;
let geocode_fut = geocode_stdio(
spec,
opt.match_strategy,
opt.license,
opt.on_duplicate_columns,
structure,
);
let mut runtime =
tokio::runtime::Runtime::new().expect("Unable to create a runtime");
runtime.block_on(geocode_fut.boxed())?;
Ok(())
}