api_key 0.1.0

Generate api key in rust supports base32, base62, string, uuid4, uuid5
Documentation
use crate::{
  types::{Default, UuidV5Generator},
  utils::{add_prefix, random_16_bytes, uuid5},
};

impl Default for UuidV5Generator {
  fn default() -> Self {
    UuidV5Generator {
      prefix: "".to_string(),
      namespace: None,
      dashes: true,
      batch: 0,
    }
  }
}

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

  pub fn gen(&self) -> String {
    if self.batch <= 0 {
      if !self.namespace.is_some() {
        panic!("The required 'namespace' option must be present");
      }
    }

    let bytes: [u8; 16] = match self.batch {
      0 => self.namespace.unwrap(),
      _ => random_16_bytes(),
    };

    let uuid = uuid5(bytes);

    let mut api_key = match self.dashes {
      true => uuid,
      _ => uuid.replace("-", ""),
    };

    add_prefix(&mut api_key, &self.prefix)
  }
}

#[cfg(test)]
mod tests {
  use uuid::Uuid;

  use crate::{
    types::{Default, UuidV5Generator},
    utils::Utility,
  };

  #[test]
  fn generate_key_with_prefix() {
    let options = UuidV5Generator {
      prefix: String::from("PREFIX-"),
      namespace: Some(*Uuid::NAMESPACE_DNS.as_bytes()),
      ..UuidV5Generator::default()
    };

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

  #[test]
  fn generate_key_with_dashes() {
    let options = UuidV5Generator {
      namespace: Some(*Uuid::NAMESPACE_DNS.as_bytes()),
      ..UuidV5Generator::default()
    };

    let result = UuidV5Generator::gen(&options);
    assert!(result.contains("-"))
  }

  #[test]
  fn generate_key_without_dashes_and_with_namespace() {
    let options = UuidV5Generator {
      dashes: false,
      namespace: Some(*Uuid::NAMESPACE_DNS.as_bytes()),
      ..UuidV5Generator::default()
    };

    let result = UuidV5Generator::gen(&options);
    assert!(!result.contains("-"))
  }

  #[test]
  fn generate_key_with_dashes_and_with_namespace() {
    let options = UuidV5Generator {
      dashes: true,
      namespace: Some(*Uuid::NAMESPACE_URL.as_bytes()),
      ..UuidV5Generator::default()
    };

    let result = UuidV5Generator::gen(&options);
    assert!(match Uuid::parse_str(&result) {
      Ok(_) => result.contains("-"),
      Err(_) => false,
    });
  }

  #[test]
  fn generate_key_without_namespace() {
    let options = UuidV5Generator {
      batch: 2,
      namespace: None,
      ..UuidV5Generator::default()
    };

    let result = UuidV5Generator::gen(&options);
    assert!(match Uuid::parse_str(&result) {
      Ok(_) => true,
      Err(_) => false,
    })
  }

  #[test]
  fn generate_key_batch() {
    let options = UuidV5Generator {
      batch: 2,
      namespace: None,
      ..UuidV5Generator::default()
    };

    let result = Utility::batch(&options);
    assert!(result.len() == 2)
  }
}