use std::path::Path;
use std::io::{self, Read};
use chrono::Utc;
use clap::Parser;
use vios_core::vault::vault_structs::{VaultMetadata, VaultPayload};
#[derive(Parser, Debug)]
#[command(author, version, about = "VIOS Vault Writer")]
struct Args {
#[arg(long)]
out: String,
#[arg(long)]
password: String,
#[arg(long)]
creator: Option<String>,
#[arg(long)]
content: Option<String>,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let args = Args::parse();
let plaintext = match args.content {
Some(s) => s,
None => {
let mut buf = String::new();
io::stdin().read_to_string(&mut buf)?;
if buf.trim().is_empty() {
return Err("No --content provided and STDIN was empty.".into());
}
buf
}
};
let creator = args
.creator
.unwrap_or_else(|| whoami::realname().trim().to_string());
let metadata = VaultMetadata {
creator_name: creator,
created_at: Utc::now().to_rfc3339(),
system_fingerprint: whoami::fallible::hostname()
.unwrap_or_else(|_| "unknown-host".to_string()),
tone_classification: None,
intent_classification: None,
reem_code: None,
cia_hash: None,
};
let payload = VaultPayload {
content: plaintext,
creator_name: metadata.creator_name.clone(),
metadata,
};
if let Some(parent) = Path::new(&args.out).parent() {
if !parent.as_os_str().is_empty() {
std::fs::create_dir_all(parent)?;
}
}
{
let bytes = serde_json::to_vec(&payload)?;
vios_core::vault::vault_crypto::write_vault_v2_file(
std::path::Path::new(&args.out),
&args.password,
&bytes,
)?;
}
eprintln!("✅ Wrote vault: {}", &args.out);
Ok(())
}