diff options
Diffstat (limited to 'vendor/minifier/src/main.rs')
-rw-r--r-- | vendor/minifier/src/main.rs | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/vendor/minifier/src/main.rs b/vendor/minifier/src/main.rs new file mode 100644 index 000000000..eb420325e --- /dev/null +++ b/vendor/minifier/src/main.rs @@ -0,0 +1,94 @@ +// Take a look at the license at the top of the repository in the LICENSE file. + +extern crate minifier; + +use std::env; +use std::ffi::OsStr; +use std::fs::{File, OpenOptions}; +use std::io::{self, Read, Write}; +use std::path::{Path, PathBuf}; + +use minifier::{css, js, json}; + +fn print_help() { + println!( + r##"For now, this minifier supports the following type of files: + + * .css + * .js + * .json"## + ); +} + +pub fn get_all_data(file_path: &str) -> io::Result<String> { + let mut file = File::open(file_path)?; + let mut data = String::new(); + + file.read_to_string(&mut data).unwrap(); + Ok(data) +} + +fn call_minifier<F>(file_path: &str, func: F) +where + F: Fn(&str) -> String, +{ + match get_all_data(file_path) { + Ok(content) => { + let mut out = PathBuf::from(file_path); + let original_extension = out + .extension() + .unwrap_or_else(|| OsStr::new("")) + .to_str() + .unwrap_or("") + .to_owned(); + out.set_extension(format!("min.{}", original_extension)); + if let Ok(mut file) = OpenOptions::new() + .truncate(true) + .write(true) + .create(true) + .open(out.clone()) + { + if let Err(e) = write!(file, "{}", func(&content)) { + eprintln!("Impossible to write into {:?}: {}", out, e); + } else { + println!("{:?}: done -> generated into {:?}", file_path, out); + } + } else { + eprintln!("Impossible to create new file: {:?}", out); + } + } + Err(e) => eprintln!("\"{}\": {}", file_path, e), + } +} + +fn main() { + let args: Vec<_> = env::args().skip(1).collect(); + + if args.is_empty() { + println!("Missing files to work on...\nExample: ./minifier file.js\n"); + print_help(); + return; + } + for arg in &args { + let p = Path::new(arg); + + if !p.is_file() { + eprintln!("\"{}\" isn't a file", arg); + continue; + } + match p + .extension() + .unwrap_or_else(|| OsStr::new("")) + .to_str() + .unwrap_or("") + { + "css" => call_minifier(arg, |s| { + css::minify(s).expect("css minification failed").to_string() + }), + "js" => call_minifier(arg, |s| js::minify(s).to_string()), + "json" => call_minifier(arg, |s| json::minify(s).to_string()), + // "html" | "htm" => call_minifier(arg, html::minify), + x => println!("\"{}\": this format isn't supported", x), + } + } +} |