twetch_sdk/commands/
mod.rs1use regex::Regex;
2use wasm_bindgen::prelude::*;
3
4#[wasm_bindgen]
5#[allow(non_camel_case_types)]
6#[derive(Debug, Clone, Copy)]
7pub enum Currency {
8 BSV,
9 USD,
10}
11
12#[wasm_bindgen]
13pub struct PayCommand {
14 pub amount: f64,
15 pub currency: Currency,
16}
17
18impl PayCommand {
19 pub fn from_string(description: &String) -> Option<PayCommand> {
20 let pay_any_regex = Regex::new(r"(/[pP][aA][yY])\s+((@\d+\s+)|([a-zA-Z-_\d]+@[a-zA-Z-_\d.]+[a-zA-Z\d]\s+)|([1][a-km-zA-HJ-NP-Z\d]{25,34}\s+)|([$][a-zA-Z-_.]{4,50}\s+)|([1][a-zA-Z\d]+\s+))+(((((\d{1,8})?(.\d{1,8}))|((\d{1,8})(.\d{1,8})?))\s*([bB][sS][vV]))|([$][\d]+(.[\d]+)?))").unwrap();
21 let pay_any_currency = Regex::new(r"(?P<bsv>(((\d{1,8})?\.\d{1,8})|(\d{1,8}(\.\d{1,8})?))\s*[bB][sS][vV])|(?P<usd>[$][\d]*(\.[\d]+)?)").unwrap();
22
23 let mut currency = Currency::USD;
24 let mut amount = 0f64;
25
26 let pay_match = match pay_any_regex.find(&description) {
27 None => return None,
28 Some(p) => p,
29 };
30
31 let pay_match_str = pay_match.as_str();
32
33 println!("pay_match_str {:?}", pay_match_str);
34
35 let pay_currency_match = pay_any_currency
36 .find_iter(pay_match_str)
37 .last()
38 .unwrap()
39 .as_str();
40 let captures = pay_any_currency.captures(pay_currency_match).unwrap();
41
42 match captures.name("usd") {
43 None => (),
44 Some(value) => {
45 let mut chars = value.as_str().chars();
46 chars.next(); amount = chars.as_str().to_string().parse::<f64>().unwrap();
48 }
49 }
50
51 match captures.name("bsv") {
52 None => (),
53 Some(_value) => {
54 currency = Currency::BSV;
55 amount = captures
56 .get(2)
57 .unwrap()
58 .as_str()
59 .to_string()
60 .parse::<f64>()
61 .unwrap();
62 }
63 }
64
65 return Some(PayCommand { amount, currency });
66 }
67
68 pub fn get_amount_usd(&self, exchange_rate: &f64) -> f64 {
69 match &self.currency {
70 Currency::BSV => {
71 return self.amount * exchange_rate;
72 }
73 Currency::USD => {
74 return self.amount;
75 }
76 }
77 }
78
79 pub fn get_amount_bsv(&self, exchange_rate: &f64) -> f64 {
80 match &self.currency {
81 Currency::BSV => {
82 return self.amount;
83 }
84 Currency::USD => {
85 return self.amount / exchange_rate;
86 }
87 }
88 }
89}