Compare commits

...

4 commits

2 changed files with 25 additions and 15 deletions

View file

@ -9,6 +9,7 @@ edition = "2021"
#copy_dir = "0.1.3"
pico-args = "0.5.0"
tera = "1.19.0"
termion = "2.0.1"
toml = "0.7.6"
[profile.release]

View file

@ -7,12 +7,21 @@ use std::{
};
use core::error::Error;
use toml::{ map::Map, Value };
use tera::{ Context, Tera };
use termion::{
color::{ self, Fg },
style
};
use toml::{ map::Map, Value };
static FAIL: Fg<color::LightRed> = Fg(color::LightRed);
static SUCCESS: Fg<color::LightGreen> = Fg(color::LightGreen);
static WARN: Fg<color::Yellow> = Fg(color::Yellow);
static RESET: Fg<color::Reset> = Fg(color::Reset);
pub fn apply(targets: &Vec<Map<String, Value>>) {
let home = var("HOME").unwrap();
println!("running apply:");
println!("{}running apply{}", style::Bold, style::Reset);
for target in targets {
// get path and name
let path = target.get("path");
@ -22,18 +31,18 @@ pub fn apply(targets: &Vec<Map<String, Value>>) {
if path.is_none() {
if i_name.is_some() {
let name = i_name.unwrap().as_str().unwrap();
println!(" \"{name}\" is missing its path property; skipping");
} else { println!(" skipping empty target"); }
println!(" {WARN}\"{name}\" is missing its path property; skipping{RESET}");
} else { println!(" {WARN}skipping empty target{RESET}"); }
continue;
}
if i_name.is_none() {
println!(" target missing name; skipping");
println!(" {WARN}target missing name; skipping{RESET}");
continue;
}
// print applying text
let name = i_name.unwrap().as_str().unwrap();
println!(" applying \"{name}\":");
println!(" applying \"{name}\":");
// set up paths
let destination = Path::new(path.unwrap().as_str().unwrap());
@ -42,26 +51,26 @@ pub fn apply(targets: &Vec<Map<String, Value>>) {
// copy and print
let result = fs::copy(source, destination);
if result.is_err() { println!(" failed to copy!"); }
else { println!(" completed successfully"); }
if result.is_err() { println!(" {FAIL}failed to copy!{RESET}"); }
else { println!(" {SUCCESS}completed successfully{RESET}"); }
}
}
pub fn build(targets: &Vec<Map<String, Value>>, tera: &mut Tera, context: &Context) {
let home = var("HOME").unwrap();
println!("running build:");
println!("{}running build{}", style::Bold, style::Reset);
for target in targets {
// get name property
let i_name = target.get("name");
// handle empty names gracefully
if i_name.is_none() {
println!(" target missing name; skipping");
println!(" {WARN}target missing name; skipping{RESET}");
continue;
}
// print building text
let name = i_name.unwrap().as_str().unwrap();
println!(" building \"{name}\":");
println!(" building \"{name}\":");
// render template
let render = tera.render(name, context);
@ -70,7 +79,7 @@ pub fn build(targets: &Vec<Map<String, Value>>, tera: &mut Tera, context: &Conte
let error = render.err().unwrap();
let message = error.source().unwrap();
println!(" failed to render template:\n {message}");
println!(" {FAIL}failed to render template:\n {message}{RESET}");
continue;
}
@ -80,14 +89,14 @@ pub fn build(targets: &Vec<Map<String, Value>>, tera: &mut Tera, context: &Conte
let path = Path::new(&destination);
let i_file = File::create(path);
if i_file.is_err() {
println!(" failed to create destination file at {path:?}");
println!(" {FAIL}failed to create destination file at {path:?}{RESET}");
continue;
}
let mut file = i_file.unwrap();
// write to destination file
let written = write!(&mut file, "{output}");
if written.is_err() { println!(" failed to write to destination file at {path:?}"); }
else { println!(" completed successfully"); }
if written.is_err() { println!(" {FAIL}failed to write to destination file at {path:?}{RESET}"); }
else { println!(" {SUCCESS}completed successfully{RESET}"); }
}
}