extern crate fs_extra;
extern crate handlebars;
extern crate serde;
extern crate serde_json;
extern crate toml;
#[macro_use]
extern crate failure;
use serde_json::value::Value as SerdeJson;
use toml::Value as Toml;
use serde::ser::Serialize;
use handlebars::Handlebars;
use failure::Error;
pub mod template;
pub mod data;
pub mod generate;
pub struct Slime<'a> {
config: Config<'a>,
templates: Option<Handlebars>,
}
impl<'a> Slime<'a> {
pub fn new(config: Config<'a>) -> Slime<'a> {
Slime {
config: config,
templates: None,
}
}
pub fn initialize(&mut self) -> Result<(), Error> {
let hb: Handlebars = template::load_all(&self.config)?;
self.templates = Some(hb);
Ok(())
}
pub fn load_json_data(&self, file_name: &str) -> Result<SerdeJson, Error> {
data::load_json(self.config.data_path, file_name)
}
pub fn load_toml_data(&self, file_name: &str) -> Result<Toml, Error> {
data::load_toml(self.config.data_path, file_name)
}
pub fn generate<T: Serialize>(
&self,
template: &str,
file_name: &str,
data: &T,
) -> Result<(), Error> {
match &self.templates {
&Some(ref hb) => {
generate::generate(
&hb,
template,
data,
self.config.generated_path,
file_name,
)?;
Ok(())
}
&None => bail!("templates not loaded! use Slime::initialize()"),
}
}
}
impl<'a> Default for Slime<'a> {
fn default() -> Slime<'a> {
Slime::new(Config::default())
}
}
pub struct Config<'a> {
data_path: &'a str,
generated_path: &'a str,
templates_path: &'a str,
}
impl<'a> Config<'a> {
pub fn new(data_path: &'a str, generated_path: &'a str, templates_path: &'a str) -> Config<'a> {
Config {
data_path: data_path,
generated_path: generated_path,
templates_path: templates_path,
}
}
}
impl<'a> Default for Config<'a> {
fn default() -> Config<'a> {
Config {
data_path: "data",
generated_path: "generated",
templates_path: "templates",
}
}
}
fn has_ext(file_name: &str)-> bool
{
file_name.contains(".")
}
fn get_filename_with_ext(file_name: &str, extension: &str) -> String
{
match has_ext(file_name)
{
true => file_name.to_string(),
false => format!("{}.{}", file_name, extension)
}
}