crypto_rust/
checker.rs

1use regex::Regex;
2use checker_error::Error;
3
4pub mod checker_error {
5    use thiserror::Error;
6
7    #[derive(Error, Debug)]
8    pub enum Error {
9        #[error("Two currency parameters is required.\nSyntax: {} price <currency1> <currency2>\n", env!("CARGO_PKG_NAME"))]
10        ParamCountError,
11        
12        #[error("Invalid currency format for \"{currency}\".\nCurrency should be only composed of letters with a length of 3 or 4 characters.")]
13        CurrencyFormatError {
14            currency: String
15        },
16
17        #[error("Invalid CMC api key format.\n\nCorrect format should be:\nXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n")]
18        ApiKeyFormatError
19    }
20}
21
22
23
24pub fn params_for_price(
25    args: Vec<String>
26) -> Result<(String, String), checker_error::Error> {
27
28    if args.len() < 4 {
29        return Err(Error::ParamCountError);
30    }
31
32    let first_currency: String = args[2].to_uppercase();
33    let second_currency: String = args[3].to_uppercase();
34
35    verify_currency_format(&first_currency)?;
36    verify_currency_format(&second_currency)?;
37
38    return Ok((first_currency, second_currency));
39}
40
41pub fn verify_cmc_api_key_format(api_key: &String) -> Result<(), Error> {
42    let api_key_regex = Regex::new(
43        r"^[a-z0-9]{8}[-][a-z0-9]{4}[-][a-z0-9]{4}[-][a-z0-9]{4}[-][a-z0-9]{12}$"
44    ).unwrap();
45
46    if !api_key_regex.is_match(api_key) {
47        return Err(Error::ApiKeyFormatError);
48    }
49    else {
50        return Ok(());
51    }
52}
53
54fn verify_currency_format(currency: &String) -> Result<(), Error> {
55    let currency_regex = Regex::new(r"^[A-Z]{3,4}$").unwrap();
56
57    if !currency_regex.is_match(currency) {
58        return Err(Error::CurrencyFormatError{currency: String::from(currency)});
59    }
60    else { 
61        return Ok(());
62    }
63}