🔨 Moves to pass-cli json output format

Signed-off-by: Ash Svitan <selfsigned-ash@proton.me>
This commit is contained in:
2026-04-30 15:08:48 +02:00
parent eea8204fe2
commit 4337534f1a
4 changed files with 146 additions and 94 deletions
+6 -5
View File
@@ -8,15 +8,16 @@ const ENV_VAR_DEFAULT_VAULT: &str = "PASS_VAULT";
fn main() -> Result<(), Error> {
pass::check_pass()?;
let vaults = pass::get_vaults()?;
let vaults = pass::get_vaults().vaults;
if vaults.len() <= 0 {
return Err(Error::new(ErrorKind::Other, "No vaults found"));
}
let vault_names = vaults.iter().map(|vault| vault.name.clone()).collect::<Vec<String>>();
let vault;
match env::var(ENV_VAR_DEFAULT_VAULT) {
Ok(default_vault) => {
if vaults.contains(&default_vault) {
if vault_names.contains(&default_vault) {
vault = default_vault;
} else {
return Err(Error::new(
@@ -26,7 +27,7 @@ fn main() -> Result<(), Error> {
}
}
Err(_) => {
vault = vaults.get(0).unwrap().clone();
vault = vault_names.get(0).unwrap().clone();
println!(
"No default vault found (you can set it with {}), using {}...",
ENV_VAR_DEFAULT_VAULT, vault
@@ -34,8 +35,8 @@ fn main() -> Result<(), Error> {
}
};
let items = pass::get_items(&vault);
println!("{:?}", items);
let items = pass::get_items(&vault).items;
println!("{:?}", items[0]);
return Ok(());
}
+57 -46
View File
@@ -1,10 +1,58 @@
use crate::sh;
use fancy_regex::{Regex, RegexBuilder};
use std::io::{Error, ErrorKind};
use serde::Deserialize;
const EXECUTABLE: &str = "pass-cli";
const VAULT_NAME_REGEX: &str = r"(?<=- \[.{88}\]: ).*";
const ITEM_NAME_REGEX: &str = r"(?<=- \[.{88}\]: ).*(?= )";
#[derive(Deserialize, Debug)]
pub struct Vaults {
pub vaults: Vec<Vault>
}
#[derive(Deserialize, Debug)]
pub struct Vault {
pub name: String,
pub vault_id: String,
pub share_id: String
}
#[derive(Deserialize, Debug)]
pub struct Items {
pub items: Vec<Item>
}
#[derive(Deserialize, Debug)]
pub struct Item {
pub id: String,
pub share_id: String,
pub vault_id: String,
pub content: ItemContent,
pub state: String,
pub create_time: String,
pub modify_time: String
}
#[derive(Deserialize, Debug)]
pub struct ItemContent {
pub title: String,
pub note: String,
pub item_uuid: String,
pub content: ItemContentContent,
}
#[derive(Deserialize, Debug)]
pub struct ItemContentContent {
pub Login: Option<ItemLogin>
}
#[derive(Deserialize, Debug)]
pub struct ItemLogin {
pub email: String,
pub username: String,
pub password: String,
pub urls: Vec<String>,
pub totp_uri: String
}
pub fn check_pass() -> Result<(), Error> {
let which = sh::sh(format!("which {}", EXECUTABLE));
@@ -26,49 +74,12 @@ pub fn check_pass() -> Result<(), Error> {
return Ok(());
}
pub fn get_vaults() -> Result<Vec<String>, Error> {
let re = Regex::new(VAULT_NAME_REGEX).unwrap();
let vaults_raw = sh::sh(format!("{} vault list", EXECUTABLE));
let matches = re.find_iter(vaults_raw.as_str());
let mut vaults = Vec::<String>::new();
for each in matches {
if let Err(_) = each {
continue;
}
let each = each.unwrap();
let vault = each.as_str();
if !vault.is_empty() {
vaults.push(vault.to_string());
}
}
return Ok(vaults);
pub fn get_vaults() -> Vaults {
let vaults_raw = sh::sh(format!("{} vault list --output json", EXECUTABLE));
return serde_json::from_str(vaults_raw.as_str()).expect("Couldn't parse JSON");
}
pub fn get_items(vault: &String) -> Result<Vec<String>, 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::<String>::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);
pub fn get_items(vault: &String) -> Items {
let items_raw = sh::sh(format!("{} item list {} --output json", EXECUTABLE, vault));
return serde_json::from_str(items_raw.as_str()).expect("Couldn't parse JSON");
}