Skip to main content

solana_tools_lite_cli/flows/
generation.rs

1use crate::constants::DEFAULT_WALLET_FILENAME;
2use crate::flows::presenter::Presentable;
3use solana_tools_lite::adapters::io_adapter as io;
4use solana_tools_lite::handlers::generate;
5use solana_tools_lite::models::results::GenResult;
6use std::path::{Path, PathBuf};
7use crate::shell::error::CliError;
8use serde_json;
9
10/// High-level generation flow: orchestrates handler call, file saving, and presentation.
11///
12/// Parameters
13/// * `mnemonic_path`  – read mnemonic from file or stdin ("-"); when `None`, a new mnemonic is generated
14/// * `passphrase_path` – read BIP‑39 passphrase from file or stdin ("-"); when `None`, uses empty passphrase
15/// * `json`           – print result as JSON (`--json`)
16/// * `show_secret`    – print private part to stdout (`--unsafe-show-secret`)
17/// * `out_path`       – target path (file or directory) to save the full wallet JSON
18/// * `force`          – override the wallet file if it exists
19pub fn execute(
20    mnemonic_path: Option<&str>,
21    passphrase_path: Option<&str>,
22    json: bool,
23    show_secret: bool,
24    out_path: Option<&str>,
25    force: bool,
26) -> Result<(), CliError> {
27    let result = generate::handle(mnemonic_path, passphrase_path)?;
28    let saved_path = save_to_file(&result, out_path, force)?;
29
30    let print_stderr = out_path.is_some();
31    print_result(&result, json, show_secret, print_stderr, &saved_path)?;
32
33    Ok(())
34}
35
36fn save_to_file(
37    result: &GenResult,
38    out_path: Option<&str>,
39    force: bool,
40) -> Result<PathBuf, CliError> {
41    // Resolve final target path (directory -> append wallet.json; None -> wallet.json)
42    let target = io::resolve_final_path_with_default(out_path, DEFAULT_WALLET_FILENAME);
43
44    // Always save full wallet to file
45    let payload = serde_json::to_string_pretty(result)
46        .map_err(|e| CliError::PresentationEncode(e.to_string()))?;
47    io::write_secret_file(&target, &payload, force)?;
48
49    Ok(target)
50}
51
52/// Print output of a generation
53fn print_result(
54    result: &GenResult,
55    json: bool,
56    show_secret: bool,
57    print_stderr: bool,
58    saved_path: &Path,
59) -> Result<(), CliError> {
60    // Delegate printing to Presentable
61    result.present(json, show_secret, print_stderr)?;
62
63    // Always inform where the wallet was saved
64    eprintln!("Saved: {}", saved_path.display());
65    Ok(())
66}