api_key 0.1.0

Generate api key in rust supports base32, base62, string, uuid4, uuid5
Documentation
use crate::{
  constants::{get_default_character, DEFAULT_MAX_LENGTH, DEFAULT_MIN_LENGTH},
  types::{Default, StringGenerator},
  utils::add_prefix,
};
use rand::Rng;

impl Default for StringGenerator {
  fn default() -> Self {
    StringGenerator {
      min: DEFAULT_MIN_LENGTH,
      max: DEFAULT_MAX_LENGTH,
      pool: get_default_character(),
      prefix: "".to_string(),
      length: 0,
      batch: 0,
    }
  }
}

impl StringGenerator {
  pub fn new() -> Self {
    Self {
      ..Default::default()
    }
  }

  pub fn gen(&self) -> String {
    let length = if self.length > 0 {
      self.length
    } else {
      rand::thread_rng().gen_range(self.min..=self.max)
    };

    add_prefix(
      &mut generate_random_string(&self.pool, length),
      &self.prefix,
    )
  }
}

fn generate_random_string(pool: &String, length: u8) -> String {
  let mut rng = rand::thread_rng();
  (0..length)
    .map(|_| {
      let idx = rng.gen_range(0..pool.len());
      pool.chars().nth(idx).unwrap()
    })
    .collect()
}

#[cfg(test)]
mod tests {
  use crate::types::{Default, StringGenerator};

  #[test]
  fn test_random_string_with_prefix() {
    let options = StringGenerator {
      prefix: String::from("PREFIX-"),
      ..StringGenerator::default()
    };

    let result = options.gen();
    assert!(&result.starts_with("PREFIX"));
  }

  #[test]
  fn test_random_string_with_min_max() {
    let options = StringGenerator {
      min: 5,
      max: 8,
      ..StringGenerator::default()
    };

    let result = options.gen();
    let result_length = result.len();
    assert!(result_length >= 5 && result_length <= 8);
  }

  #[test]
  fn test_random_string_with_length() {
    let options = StringGenerator {
      length: 10,
      ..StringGenerator::default()
    };

    let result = options.gen();

    assert!(result.len() >= 10);
  }

  #[test]
  fn test_random_string_with_defaults() {
    let options = StringGenerator::new();
    let result = options.gen();

    assert!(result.len() >= 16 && result.len() <= 32);
  }
}