Skip to main content

solana_tools_lite_cli/flows/
verify.rs

1use crate::flows::presenter::Presentable;
2use solana_tools_lite::adapters::io_adapter as io;
3use solana_tools_lite::adapters::io_adapter::{read_message, read_pubkey, read_signature};
4use solana_tools_lite::handlers::verify;
5use solana_tools_lite::models::results::VerifyResult;
6use std::path::Path;
7use crate::shell::error::CliError;
8
9/// Verify flow: calls domain handler and prints result.
10/// Returns Ok(()) on valid signature; returns an error to trigger non-zero exit on invalid.
11pub fn execute(
12    message: Option<&str>,
13    message_file: Option<&str>,
14    signature: Option<&str>,
15    signature_file: Option<&str>,
16    pubkey: Option<&str>,
17    pubkey_file: Option<&str>,
18    output: Option<&str>,
19    force: bool,
20    json: bool,
21) -> Result<(), CliError> {
22    // Resolve inputs using IO helpers
23    let msg = read_message(message, message_file)?;
24    let sig = read_signature(signature, signature_file)?;
25    let pk = read_pubkey(pubkey, pubkey_file)?;
26
27    let result = verify::handle(&msg, &sig, &pk)?;
28
29    // Persist full JSON artifact to file only if requested
30    let saved_path = io::save_pretty_json(&result, output, force, "verification.json")?;
31
32    // Print result: when saving, keep stdout clean and print status + Saved to stderr
33    print_result(&result, json, saved_path.as_deref())?;
34
35    Ok(())
36}
37
38fn print_result(
39    result: &VerifyResult,
40    json: bool,
41    saved_path: Option<&Path>,
42) -> Result<(), CliError> {
43    match saved_path {
44        Some(path) => {
45            eprintln!("[✓] Signature is valid");
46            eprintln!("Saved: {}", path.display());
47        }
48        None => {
49            // Delegate printing to Presentable for stdout formatting
50            result.present(json, false, false)?;
51        }
52    }
53    Ok(())
54}