mostro_client/
nip33.rs

1use anyhow::{Ok, Result};
2use mostro_core::prelude::*;
3use nostr_sdk::prelude::*;
4use std::str::FromStr;
5use uuid::Uuid;
6
7pub fn order_from_tags(tags: Tags) -> Result<SmallOrder> {
8    let mut order = SmallOrder::default();
9
10    for tag in tags {
11        let t = tag.to_vec(); // Vec<String>
12        if t.is_empty() {
13            continue;
14        }
15
16        let key = t[0].as_str();
17        let values = &t[1..];
18
19        let v = values.first().map(|s| s.as_str()).unwrap_or_default();
20
21        match key {
22            "d" => {
23                order.id = Uuid::parse_str(v).ok();
24            }
25            "k" => {
26                order.kind = mostro_core::order::Kind::from_str(v).ok();
27            }
28            "f" => {
29                order.fiat_code = v.to_string();
30            }
31            "s" => {
32                order.status = Status::from_str(v).ok().or(Some(Status::Pending));
33            }
34            "amt" => {
35                order.amount = v.parse::<i64>().unwrap_or(0);
36            }
37            "fa" => {
38                if v.contains('.') {
39                    continue;
40                }
41                if let Some(max_str) = values.get(1) {
42                    order.min_amount = v.parse::<i64>().ok();
43                    order.max_amount = max_str.parse::<i64>().ok();
44                } else {
45                    order.fiat_amount = v.parse::<i64>().unwrap_or(0);
46                }
47            }
48            "pm" => {
49                order.payment_method = values.join(",");
50            }
51            "premium" => {
52                order.premium = v.parse::<i64>().unwrap_or(0);
53            }
54            _ => {}
55        }
56    }
57
58    Ok(order)
59}
60
61pub fn dispute_from_tags(tags: Tags) -> Result<Dispute> {
62    let mut dispute = Dispute::default();
63    for tag in tags {
64        let t = tag.to_vec();
65
66        // Check if tag has at least 2 elements
67        if t.len() < 2 {
68            continue;
69        }
70
71        let key = t.first().map(|s| s.as_str()).unwrap_or("");
72        let value = t.get(1).map(|s| s.as_str()).unwrap_or("");
73
74        match key {
75            "d" => {
76                let id = value
77                    .parse::<Uuid>()
78                    .map_err(|_| anyhow::anyhow!("Invalid dispute id"))?;
79                dispute.id = id;
80            }
81
82            "s" => {
83                let status = DisputeStatus::from_str(value)
84                    .map_err(|_| anyhow::anyhow!("Invalid dispute status"))?;
85                dispute.status = status.to_string();
86            }
87
88            _ => {}
89        }
90    }
91
92    Ok(dispute)
93}