From d4fb1a05cfed6b8e0ed1d79f231d2e6f7dc735a0 Mon Sep 17 00:00:00 2001 From: Ajeet D'Souza <98ajeet@gmail.com> Date: Sat, 28 Mar 2020 00:38:36 +0530 Subject: [PATCH] Manually parse environment variables --- Cargo.lock | 10 ---------- Cargo.toml | 1 - src/config.rs | 41 ++++++++++++++++++++++++++++++++++++++++ src/db.rs | 6 +++--- src/env.rs | 21 -------------------- src/main.rs | 17 ++++++----------- src/subcommand/add.rs | 9 ++++----- src/subcommand/import.rs | 5 ++--- src/subcommand/query.rs | 15 +++++++-------- src/subcommand/remove.rs | 5 ++--- src/util.rs | 10 ++++------ 11 files changed, 69 insertions(+), 71 deletions(-) create mode 100644 src/config.rs delete mode 100644 src/env.rs diff --git a/Cargo.lock b/Cargo.lock index 7e40c16..a83395e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -136,14 +136,6 @@ dependencies = [ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "envy" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "getrandom" version = "0.1.14" @@ -421,7 +413,6 @@ dependencies = [ "bstr 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "envy 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "indoc 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.105 (registry+https://github.com/rust-lang/crates.io-index)", "structopt 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", @@ -446,7 +437,6 @@ dependencies = [ "checksum crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" "checksum dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" "checksum dirs-sys 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "afa0b23de8fd801745c471deffa6e12d248f962c9fd4b4c33787b055599bde7b" -"checksum envy 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f938a4abd5b75fe3737902dbc2e79ca142cc1526827a9e40b829a086758531a9" "checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" "checksum hermit-abi 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1010591b26bbfe835e9faeabeb11866061cc7dcebffd56ad7d0942d0e61aefd8" diff --git a/Cargo.toml b/Cargo.toml index e31e3a3..8e495ea 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,6 @@ anyhow = "1.0.27" bincode = "1.2.1" clap = "2.33.0" dirs = "2.0.2" -envy = "0.4.1" indoc = "0.3.5" serde = { version = "1.0.105", features = ["derive"] } structopt = "0.3.12" diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..cdde196 --- /dev/null +++ b/src/config.rs @@ -0,0 +1,41 @@ +use crate::types::Rank; + +use anyhow::{bail, Context, Result}; +use std::env; +use std::fs; +use std::path::PathBuf; + +pub fn zo_data() -> Result { + let path = match env::var_os("_ZO_DATA") { + Some(data_osstr) => PathBuf::from(data_osstr), + None => { + if let Some(mut cache_dir) = dirs::cache_dir() { + cache_dir.push("zoxide"); + cache_dir + } else if let Some(mut home_dir) = dirs::home_dir() { + home_dir.push(".zoxide"); + home_dir + } else { + bail!("could not generate default directory, please set _ZO_DATA manually"); + } + } + }; + + fs::create_dir_all(&path).context("could not create _ZO_DATA directory")?; + Ok(path) +} + +pub fn zo_maxage() -> Result { + match env::var_os("_ZO_MAXAGE") { + Some(maxage_osstr) => match maxage_osstr.to_str() { + Some(maxage_str) => { + let maxage = maxage_str + .parse::() + .context("unable to parse _ZO_MAXAGE as integer")?; + Ok(maxage as Rank) + } + None => bail!("invalid Unicode in _ZO_MAXAGE"), + }, + None => Ok(1000.0), + } +} diff --git a/src/db.rs b/src/db.rs index e4973c8..ec01efb 100644 --- a/src/db.rs +++ b/src/db.rs @@ -163,11 +163,11 @@ impl DB { for dir in &mut self.dirs { dir.rank *= factor; } + + self.dirs.retain(|dir| dir.rank >= 1.0); } - self.dirs.retain(|dir| dir.rank >= 1.0); self.modified = true; - Ok(()) } @@ -214,7 +214,7 @@ impl DB { fn get_path_tmp(&self) -> PathBuf { let mut path_tmp = self.path.clone(); - path_tmp.set_file_name(".zo.tmp"); + path_tmp.set_file_name("db.zo.tmp"); path_tmp } diff --git a/src/env.rs b/src/env.rs deleted file mode 100644 index ec974f8..0000000 --- a/src/env.rs +++ /dev/null @@ -1,21 +0,0 @@ -use serde::Deserialize; -use std::path::PathBuf; - -#[derive(Deserialize, Debug)] -pub struct Env { - #[serde(default = "default_maxage")] - pub maxage: i64, - - #[serde(default = "default_data")] - pub data: Option, -} - -fn default_maxage() -> i64 { - 1000 -} - -fn default_data() -> Option { - let mut path = dirs::home_dir()?; - path.push(".zo"); - Some(path) -} diff --git a/src/main.rs b/src/main.rs index 7e8e681..f1c2766 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,11 @@ +mod config; mod db; mod dir; -mod env; mod subcommand; mod types; mod util; -use crate::env::Env; - -use anyhow::{Context, Result}; +use anyhow::Result; use structopt::StructOpt; #[derive(Debug, StructOpt)] @@ -22,16 +20,13 @@ enum Zoxide { pub fn main() -> Result<()> { let opt = Zoxide::from_args(); - let env = envy::prefixed("_ZO_") - .from_env::() - .context("could not parse environment variables")?; match opt { - Zoxide::Add(add) => add.run(&env)?, - Zoxide::Import(import) => import.run(&env)?, + Zoxide::Add(add) => add.run()?, + Zoxide::Import(import) => import.run()?, Zoxide::Init(init) => init.run()?, - Zoxide::Query(query) => query.run(&env)?, - Zoxide::Remove(remove) => remove.run(&env)?, + Zoxide::Query(query) => query.run()?, + Zoxide::Remove(remove) => remove.run()?, }; Ok(()) diff --git a/src/subcommand/add.rs b/src/subcommand/add.rs index 35160fb..71550ee 100644 --- a/src/subcommand/add.rs +++ b/src/subcommand/add.rs @@ -1,5 +1,4 @@ -use crate::env::Env; -use crate::types::Rank; +use crate::config; use crate::util; use anyhow::{Context, Result}; @@ -13,10 +12,10 @@ pub struct Add { } impl Add { - pub fn run(&self, env: &Env) -> Result<()> { - let mut db = util::get_db(env)?; + pub fn run(&self) -> Result<()> { + let mut db = util::get_db()?; let now = util::get_current_time()?; - let maxage = env.maxage as Rank; + let maxage = config::zo_maxage()?; match &self.path { Some(path) => db.add(path, maxage, now), diff --git a/src/subcommand/import.rs b/src/subcommand/import.rs index db2926a..f691afd 100644 --- a/src/subcommand/import.rs +++ b/src/subcommand/import.rs @@ -1,4 +1,3 @@ -use crate::env::Env; use crate::util; use anyhow::Result; @@ -14,7 +13,7 @@ pub struct Import { } impl Import { - pub fn run(&self, env: &Env) -> Result<()> { - util::get_db(env)?.import(&self.path, self.merge) + pub fn run(&self) -> Result<()> { + util::get_db()?.import(&self.path, self.merge) } } diff --git a/src/subcommand/query.rs b/src/subcommand/query.rs index eea7c51..4bae377 100644 --- a/src/subcommand/query.rs +++ b/src/subcommand/query.rs @@ -1,4 +1,3 @@ -use crate::env::Env; use crate::util; use anyhow::{bail, Result}; @@ -15,11 +14,11 @@ pub struct Query { } impl Query { - pub fn run(mut self, env: &Env) -> Result<()> { + pub fn run(mut self) -> Result<()> { let path_opt = if self.interactive { - self.query_interactive(env)? + self.query_interactive()? } else { - self.query(env)? + self.query()? }; match path_opt { @@ -36,7 +35,7 @@ impl Query { Ok(()) } - fn query(&mut self, env: &Env) -> Result>> { + fn query(&mut self) -> Result>> { if let [path] = self.keywords.as_slice() { if Path::new(path).is_dir() { return Ok(Some(path.as_bytes().to_vec())); @@ -49,7 +48,7 @@ impl Query { *keyword = keyword.to_lowercase(); } - if let Some(dir) = util::get_db(env)?.query(&self.keywords, now) { + if let Some(dir) = util::get_db()?.query(&self.keywords, now) { // `path_to_bytes` is guaranteed to succeed here since // the path has already been queried successfully let path_bytes = util::path_to_bytes(&dir.path).unwrap(); @@ -59,14 +58,14 @@ impl Query { } } - fn query_interactive(&mut self, env: &Env) -> Result>> { + fn query_interactive(&mut self) -> Result>> { let now = util::get_current_time()?; for keyword in &mut self.keywords { *keyword = keyword.to_lowercase(); } - let dirs = util::get_db(env)?.query_all(&self.keywords); + let dirs = util::get_db()?.query_all(&self.keywords); util::fzf_helper(now, dirs) } } diff --git a/src/subcommand/remove.rs b/src/subcommand/remove.rs index c5611a9..b115c28 100644 --- a/src/subcommand/remove.rs +++ b/src/subcommand/remove.rs @@ -1,4 +1,3 @@ -use crate::env::Env; use crate::util; use anyhow::Result; @@ -11,7 +10,7 @@ pub struct Remove { } impl Remove { - pub fn run(&self, env: &Env) -> Result<()> { - util::get_db(env)?.remove(&self.path) + pub fn run(&self) -> Result<()> { + util::get_db()?.remove(&self.path) } } diff --git a/src/util.rs b/src/util.rs index c00f7e6..b6615ce 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,6 +1,6 @@ +use crate::config; use crate::db::DB; use crate::dir::Dir; -use crate::env::Env; use crate::types::Epoch; use anyhow::{anyhow, bail, Context, Result}; @@ -21,11 +21,9 @@ pub fn path_to_bytes>(path: &P) -> Option<&[u8]> { Some(path.as_ref().to_str()?.as_bytes()) } -pub fn get_db(env: &Env) -> Result { - let path = env - .data - .as_ref() - .ok_or_else(|| anyhow!("could not locate database file"))?; +pub fn get_db() -> Result { + let mut path = config::zo_data()?; + path.push("db.zo"); DB::open(path) }