twetch_sdk/commands/
mod.rs

1use 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(); // pop the leading $
47                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}