use std::env; use std::fs; use std::process; use std::str::FromStr; use serde_json::value::Value as Json; use handlebars::Handlebars; fn usage() -> ! { eprintln!("Usage: handlebars-cli template.hbs '{{\"json\": \"data\"}}'"); process::exit(1); } fn parse_json(text: &str) -> Json { let result = if let Some(text) = text.strip_prefix('@') { fs::read_to_string(text).unwrap() } else { text.to_owned() }; match Json::from_str(&result) { Ok(json) => json, Err(_) => usage(), } } fn main() { let mut args = env::args(); args.next(); // skip own filename let (filename, json) = match (args.next(), args.next()) { (Some(filename), Some(json)) => (filename, json), _ => usage(), }; let data = parse_json(&json); let mut handlebars = Handlebars::new(); handlebars .register_template_file(&filename, &filename) .ok() .unwrap(); match handlebars.render(&filename, &data) { Ok(data) => { println!("{}", data); } Err(e) => { println!("Error rendering {}: {}", filename, e); process::exit(2); } } }