commit d2118316d3e2b98c494d4beeb98af486c1e99d9f Author: southerntofu Date: Thu Apr 30 18:53:49 2020 +0200 Start rust implementation diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..072cf97 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,51 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "git-build-rs" +version = "0.1.0" +dependencies = [ + "glob", + "lazy_static", + "serde_json", +] + +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + +[[package]] +name = "itoa" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "ryu" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3d612bc64430efeb3f7ee6ef26d590dce0c43249217bddc62112540c7941e1" + +[[package]] +name = "serde" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36df6ac6412072f67cf767ebbde4133a5b2e88e76dc6187fa7104cd16f783399" + +[[package]] +name = "serde_json" +version = "1.0.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7894c8ed05b7a3a279aeb79025fdec1d3158080b75b98a08faf2806bb799edd" +dependencies = [ + "itoa", + "ryu", + "serde", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..070fa98 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "git-build-rs" +version = "0.1.0" +authors = ["southerntofu"] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +glob = "0.3" +lazy_static = "1.4" +# Translations +#serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" diff --git a/src/.db.rs.swp b/src/.db.rs.swp new file mode 100644 index 0000000..1b9a1e2 Binary files /dev/null and b/src/.db.rs.swp differ diff --git a/src/.main.rs.swp b/src/.main.rs.swp new file mode 100644 index 0000000..fe99a2d Binary files /dev/null and b/src/.main.rs.swp differ diff --git a/src/log.rs b/src/log.rs new file mode 100644 index 0000000..9a2257c --- /dev/null +++ b/src/log.rs @@ -0,0 +1,122 @@ +use std::env; +use std::collections::HashMap; +use std::path::PathBuf; +use std::fs; + +use lazy_static::lazy_static; + +lazy_static!{ + static ref LOGLEVEL: LogLevel = LogLevel::from_env(); + static ref LANG: String = lang_from_env(); + static ref TRANSLATIONS: HashMap = load_translations(); +} + +fn load_translations() -> HashMap { + let folder = env::var("I18N").unwrap_or("./i18n/".to_string()); + let mut path = PathBuf::from(folder); + if !path.is_dir() { + panic!("Could not find translations in {:?}", path); + } + path.push(format!("{}.json", *LANG)); + + if !path.is_file() { + panic!("Could not find translation file: {:?}", path); + } + + match fs::read_to_string(&path) { + Ok(content) => { + //let trans: HashMap = serde_json::from_str(&content).expect("Could not load translations"); + //return trans + match serde_json::from_str(&content) { + Ok(trans) => trans, + Err(e) => panic!("JSON ERROR: {}", e) + } + }, + Err(e) => { + panic!("IO ERROR: {}", e); + } + } +} + +fn trans(key: &str) -> String { + match TRANSLATIONS.get(key) { + Some(t) => t.to_string(), + None => { + panic!("Unknown translation string in lang {}: {}", *LANG, key); + } + } +} + +fn lang_from_env() -> String { + let lang = env::var("LANG").expect("$LANG not set in environment. Your machine is misconfigured!"); + lang[0..2].to_string() +} + + +struct LogLevel { + info: bool, + debug: bool, + error: bool +} + +impl LogLevel { + fn from_env() -> LogLevel { + // Default values + let error = true; + let mut info = true; + let mut debug = false; + + let env_log = env::var("LOG").unwrap_or("info".to_string()); + match env_log.to_lowercase().as_str() { + "info" => {}, + "debug" => { debug = true; }, + "error" => { info = false; } + _ => { + // This happens before loglevel initialization + // so we can't use warn function + eprintln!("$LOG level is incorrect: {} (can be: debug, info, error", env_log); + } + } + + return LogLevel { + info, + debug, + error + } + } +} + +fn expand(msg: &str, vars: Option<&HashMap>) -> String { + let mut trans_string = trans(msg); + if vars.is_some() { + for (key, val) in vars.unwrap() { + trans_string = trans_string.replace(key, val); + } + } + trans_string +} + +pub fn info(msg: &str, vars: Option<&HashMap>) { + if LOGLEVEL.info { + let trans_string = expand(msg, vars); + println!("[git-build] {}", trans_string); + } +} + +pub fn error(msg: &str) { + if LOGLEVEL.error { + eprintln!("ERROR: {}", msg); + } +} + +pub fn warn(msg: &str) { + if LOGLEVEL.error { + eprintln!("WARNING: {}", msg); + } +} + +pub fn debug(msg: &str) { + if LOGLEVEL.debug { + println!("DEBUG: {}", msg); + } +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..56e8eba --- /dev/null +++ b/src/main.rs @@ -0,0 +1,16 @@ +use std::env; +use std::collections::HashMap; + +mod log; + +fn main() { + + let home_dir = env::var("HOME").expect("$HOME not defined. WTF?"); + let base_dir = format!("{}/.git-build", home_dir); + + let mut test = HashMap::new(); + test.insert("$i18n_task".to_string(), "test"); + log::info("process", Some(&test)); + + //let log_level = env::var("LOG").unwrap_or +}