mostro_client/cli/
restore.rs

1use anyhow::Result;
2use mostro_core::prelude::*;
3use nostr_sdk::prelude::*;
4
5use crate::{
6    cli::Context,
7    parser::common::{create_emoji_field_row, create_field_value_header, create_standard_table},
8    parser::{dms::print_commands_results, parse_dm_events},
9    util::{send_dm, wait_for_dm},
10};
11
12pub async fn execute_restore(
13    identity_keys: &Keys,
14    mostro_key: PublicKey,
15    ctx: &Context,
16) -> Result<()> {
17    let restore_message = Message::new_restore(None);
18    let message_json = restore_message
19        .as_json()
20        .map_err(|_| anyhow::anyhow!("Failed to serialize message"))?;
21
22    // Send the restore message to Mostro server
23    let sent_message = send_dm(
24        &ctx.client,
25        Some(identity_keys),
26        &ctx.trade_keys,
27        &mostro_key,
28        message_json,
29        None,
30        false,
31    );
32
33    println!("🔄 Restore Session");
34    println!("═══════════════════════════════════════");
35    let mut table = create_standard_table();
36    table.set_header(create_field_value_header());
37    table.add_row(create_emoji_field_row(
38        "👤 ",
39        "User",
40        &identity_keys.public_key().to_string(),
41    ));
42    table.add_row(create_emoji_field_row(
43        "🎯 ",
44        "Target",
45        &mostro_key.to_string(),
46    ));
47    println!("{table}");
48    println!("💡 Sending restore request to Mostro...");
49    println!("⏳ Recovering pending orders and disputes...\n");
50
51    // Wait for incoming DM
52    let recv_event = wait_for_dm(ctx, Some(&ctx.trade_keys), sent_message).await?;
53
54    // Parse the incoming DM
55    let messages = parse_dm_events(recv_event, &ctx.trade_keys, None).await;
56    if let Some((message, _, _)) = messages.first() {
57        let message = message.get_inner_message_kind();
58        if message.action == Action::RestoreSession {
59            print_commands_results(message, ctx).await?;
60            Ok(())
61        } else {
62            Err(anyhow::anyhow!(
63                "Received response with mismatched action. Expected: {:?}, Got: {:?}",
64                Action::RestoreSession,
65                message.action
66            ))
67        }
68    } else {
69        Err(anyhow::anyhow!("No response received from Mostro"))
70    }
71}