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(); 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 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}