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}