#![deny(missing_docs, missing_debug_implementations)]
pub mod canvas;
pub mod path;
pub mod prelude;
pub mod process;
mod thread_rng;
mod user_const;
pub use euclid;
pub use failure;
pub use fart_2d_geom as geom;
pub use fart_aabb as aabb;
pub use lazy_static;
pub use noise;
pub use num_traits;
pub use rand;
pub use svg;
pub use thread_rng::FartThreadRng;
use failure::ResultExt;
use std::env;
use std::path::PathBuf;
pub type Result<T> = ::std::result::Result<T, failure::Error>;
#[derive(Debug)]
pub struct Config {
file_name: PathBuf,
rng: FartThreadRng,
}
impl Config {
fn new() -> Result<Config> {
let file_name =
env::var("FART_FILE_NAME").context("missing required FART_FILE_NAME env var")?;
let file_name = PathBuf::from(file_name);
let rng = rng();
Ok(Config { file_name, rng })
}
#[inline]
#[deprecated(note = "Use `fart::rng()` instead.")]
pub fn rng(&mut self) -> &mut impl rand::Rng {
&mut self.rng
}
}
pub fn generate<F>(f: F) -> !
where
F: FnOnce(&mut Config) -> Result<svg::Document>,
{
let then = std::time::Instant::now();
let code = match try_generate(f) {
Ok(()) => {
eprintln!(
"Generated in {:?}",
std::time::Instant::now().duration_since(then)
);
0
}
Err(e) => {
eprintln!("Error: {}", e);
for c in e.iter_causes() {
eprintln!(" Caused by: {}", c);
}
1
}
};
std::process::exit(code);
}
fn try_generate<F>(f: F) -> Result<()>
where
F: FnOnce(&mut Config) -> Result<svg::Document>,
{
let mut config = Config::new().context("failed to read configuration")?;
let doc = f(&mut config).context("function supplied to `fart::generate` failed")?;
svg::save(&config.file_name, &doc).context("failed to save SVG to a file")?;
Ok(())
}
pub fn rng() -> FartThreadRng {
return FartThreadRng::default();
}