fedimint_mint_client/
cli.rs

1use std::{ffi, iter};
2
3use anyhow::bail;
4use clap::Parser;
5use futures::StreamExt;
6use serde::Serialize;
7
8use crate::{MintClientModule, OOBNotes, ReissueExternalNotesState};
9
10#[derive(Parser, Serialize)]
11enum Opts {
12    /// Reissue out of band notes
13    Reissue { notes: OOBNotes },
14}
15
16pub(crate) async fn handle_cli_command(
17    mint: &MintClientModule,
18    args: &[ffi::OsString],
19) -> anyhow::Result<serde_json::Value> {
20    let opts = Opts::parse_from(iter::once(&ffi::OsString::from("mint")).chain(args.iter()));
21
22    match opts {
23        Opts::Reissue { notes } => {
24            let amount = notes.total_amount();
25
26            let operation_id = mint.reissue_external_notes(notes, ()).await?;
27
28            let mut updates = mint
29                .subscribe_reissue_external_notes(operation_id)
30                .await
31                .unwrap()
32                .into_stream();
33
34            while let Some(update) = updates.next().await {
35                if let ReissueExternalNotesState::Failed(e) = update {
36                    bail!("Reissue failed: {e}");
37                }
38            }
39
40            Ok(serde_json::to_value(amount).expect("JSON serialization failed"))
41        }
42    }
43}