mostro_client/cli/
restore.rs1use 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 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 let recv_event = wait_for_dm(ctx, Some(&ctx.trade_keys), sent_message).await?;
53
54 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}