diff --git a/Cargo.lock b/Cargo.lock index 079907e..145b937 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -128,7 +128,7 @@ dependencies = [ [[package]] name = "runrs" -version = "0.1.7" +version = "0.1.8" dependencies = [ "rust_util", "sha256", diff --git a/Cargo.toml b/Cargo.toml index e4939e7..e716d0f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "runrs" -version = "0.1.7" +version = "0.1.8" edition = "2018" license = "MIT/Apache-2.0" description = "Run Rust Scripts" diff --git a/README.md b/README.md index a3dbaed..647440f 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,19 @@ Run rust script Install: + ```shell cargo install --git https://git.hatter.ink/hatter/runrs runrs ``` +Environment variables + +| KEY | value | +| ---- |---------------------------------------------------------------| +| `HOME` | User home, default by OS system | +| `SKIP_CACHE` | Skip compiled cache file , turn on `true`, `yes`, `on` or `1` | +| `RUST_SCRIPT` | `rust_script` command line bin file | + +
+ Simply call `rust-script` (https://github.com/fornwall/rust-script). \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index e871767..d43264d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,17 +19,13 @@ fn main() { ); } let first_argument = args.get(0).unwrap_or_else(|| failure_and_exit!("Must assign file name")); - if first_argument == "--help" { print_help(); return; } - let script_file = first_argument; - let script_content = fs::read_to_string(script_file).unwrap_or_else(|e| - failure_and_exit!("Read file: {}, failed: {}", script_file, e) - ); - let script_sha256 = sha256::digest(script_content); + + let (_, script_sha256) = read_file_and_digest(script_file); debugging!("File {} -> sha256: {}", script_file, script_sha256); let cache_script_bin_name = format!("{}/Library/Caches/rust-script/binaries/release/{}", home, @@ -86,7 +82,31 @@ runrs [arguments] ); } +fn read_file_and_digest(script_file: &str) -> (String, String) { + match fs::metadata(script_file) { + Err(_) => failure_and_exit!("Script file not exists: {}", script_file), + Ok(metadata) => if metadata.is_dir() { + failure_and_exit!("Assigned input is dir: {}", script_file); + } else if metadata.len() > 1024 * 1024 { + failure_and_exit!("Script file: {} too large: {}", script_file, metadata.len()); + } + } + let script_content = fs::read_to_string(script_file).unwrap_or_else(|e| + failure_and_exit!("Read file: {}, failed: {}", script_file, e) + ); + let script_sha256 = sha256::digest(&script_content); + + (script_content, script_sha256) +} + fn get_run_script_bin_name(home: &str) -> PathBuf { + if let Ok(rust_script) = env::var("RUST_SCRIPT") { + let rust_script_path_buf = PathBuf::from(&rust_script); + if !rust_script_path_buf.exists() { + warning!("RUST_SCRIPT={} not exists", &rust_script); + } + return rust_script_path_buf; + } let rust_script = PathBuf::from(format!("{}/.cargo/bin/rust-script", home)); if !rust_script.exists() { warning!("rust-script not found, install it..."); @@ -105,7 +125,7 @@ fn get_run_script_bin_name(home: &str) -> PathBuf { fn is_env_on(env: &str) -> bool { env::var(env).map(|v| { - let v = v.to_string(); + let v = v.to_lowercase(); v == "true" || v == "on" || v == "yes" || v == "1" }).unwrap_or_else(|_| false) }