diff --git a/src/main.rs b/src/main.rs index b96b81b..d8e5bcd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,7 +13,7 @@ fn main() -> Result<(), Error> { return Err(Error::new(ErrorKind::Other, "No vaults found")); } - let mut vault = String::new(); + let vault; match env::var(ENV_VAR_DEFAULT_VAULT) { Ok(default_vault) => { if vaults.contains(&default_vault) { @@ -27,10 +27,15 @@ fn main() -> Result<(), Error> { } Err(_) => { vault = vaults.get(0).unwrap().clone(); - println!("No default vault found (you can set it with {}), using {}...", ENV_VAR_DEFAULT_VAULT, vault); + println!( + "No default vault found (you can set it with {}), using {}...", + ENV_VAR_DEFAULT_VAULT, vault + ); } }; - println!("selected: {:?}", vault); + + let items = pass::get_items(&vault); + println!("{:?}", items); return Ok(()); } diff --git a/src/pass.rs b/src/pass.rs index 0b5b386..d3b68a7 100644 --- a/src/pass.rs +++ b/src/pass.rs @@ -1,9 +1,10 @@ use crate::sh; -use fancy_regex::Regex; +use fancy_regex::{Regex, RegexBuilder}; use std::io::{Error, ErrorKind}; const EXECUTABLE: &str = "pass-cli"; -const VAULT_NAME_REGEX: &str = r"(?m)(?<=- \[.{88}\]: ).*$"; +const VAULT_NAME_REGEX: &str = r"(?<=- \[.{88}\]: ).*"; +const ITEM_NAME_REGEX: &str = r"(?<=- \[.{88}\]: ).*(?= )"; pub fn check_pass() -> Result<(), Error> { let which = sh::sh(format!("which {}", EXECUTABLE)); @@ -29,18 +30,11 @@ pub fn get_vaults() -> Result, Error> { let re = Regex::new(VAULT_NAME_REGEX).unwrap(); let vaults_raw = sh::sh(format!("{} vault list", EXECUTABLE)); - let captures = re - .captures(vaults_raw.as_str()) - .expect("Error running regex"); - if let None = captures { - return Err(Error::new(ErrorKind::Other, "No vault found")); - } - + let matches = re.find_iter(vaults_raw.as_str()); let mut vaults = Vec::::new(); - let captures = captures.unwrap(); - for each in captures.iter() { - if let None = each { + for each in matches { + if let Err(_) = each { continue; } @@ -53,3 +47,28 @@ pub fn get_vaults() -> Result, Error> { return Ok(vaults); } + +pub fn get_items(vault: &String) -> Result, Error> { + let re = RegexBuilder::new(ITEM_NAME_REGEX) + .multi_line(false) + .build() + .unwrap(); + let items_raw = sh::sh(format!("{} item list {}", EXECUTABLE, vault)); + + let matches = re.find_iter(items_raw.as_str()); + let mut items = Vec::::new(); + + for each in matches { + if let Err(_) = each { + continue; + } + + let each = each.unwrap(); + let item = each.as_str(); + if !item.is_empty() { + items.push(item.to_string()); + } + } + + return Ok(items); +}