vios_app 0.1.1

Small JSON vaults: Argon2id + AES-GCM, with optional AAD binding.
Documentation
// 📄 pdf_exporter.rs — Vault Certificate Generator

// When the `pdf` feature is OFF, build a tiny no-op binary so `cargo test`/`clippy` don't fail.
#[cfg(not(feature = "pdf"))]
fn main() {}

#[cfg(feature = "pdf")]
mod app {
    use std::{env, error::Error, fs::File, io::BufWriter};

    use vios_core::vault::vault_crypto::decrypt_vault;
    use vios_core::vault::vault_structs::VaultPayload;
    use vios_core::vault::vault_utils::{extend_payload, extract_reflection_line};
    use vios_core::vaultseal_utils::append_seal;

    use printpdf::{BuiltinFont, Mm, PdfDocument};

    pub fn run() -> Result<(), Box<dyn Error>> {
        let args: Vec<String> = env::args().collect();
        if args.len() < 3 {
            eprintln!("Usage: pdf_exporter <vault_file> <password>");
            std::process::exit(1);
        }

        let vault_path = &args[1];
        let password = &args[2];

        // 📌 Seal registration
        append_seal(vault_path);

        // 🔐 Decrypt the vault
        let decrypted: VaultPayload = decrypt_vault(vault_path, password)?;
        let _extended = extend_payload(&decrypted.content);
        let reflection_line = extract_reflection_line(&decrypted.content);

        // 📄 Prepare PDF
        let (doc, page1, layer1) =
            PdfDocument::new("Vault Certificate", Mm(210.0), Mm(297.0), "Layer 1");
        let current_layer = doc.get_page(page1).get_layer(layer1);
        let font = doc.add_builtin_font(BuiltinFont::Helvetica)?;

        let preview = decrypted
            .content
            .lines()
            .take(5)
            .collect::<Vec<_>>()
            .join("\n");

        let text = format!(
            "📜 VIOS Vault Certificate\n\n\
             🔐 Path: {vault_path}\n\
             🧬 REEM Code: {}\n\
             🪞 Reflection: {}\n\
             🧠 Preview:\n{}\n\n\
             🕒 Timestamp: {}\n\
             🔒 Hash: {}\n",
            decrypted
                .metadata
                .reem_code
                .clone()
                .unwrap_or_else(|| "N/A".to_string()),
            reflection_line,
            preview,
            decrypted.metadata.created_at,
            decrypted
                .metadata
                .cia_hash
                .clone()
                .unwrap_or_else(|| "N/A".to_string()),
        );

        // Write a simple block of text near the top-left margin.
        current_layer.use_text(text, 12.0, Mm(10.0), Mm(280.0), &font);

        // 💾 Save PDF
        let output_file = format!("{vault_path}_certificate.pdf");
        let mut buffer = BufWriter::new(File::create(&output_file)?);
        doc.save(&mut buffer)?;

        println!("✅ Vault certificate saved to: {output_file}");
        Ok(())
    }
}

#[cfg(feature = "pdf")]
fn main() -> Result<(), Box<dyn std::error::Error>> {
    app::run()
}