dtz_identifier/
lib.rs

1mod apikey_id;
2mod case_id;
3mod context_id;
4mod execution_id;
5mod feed_id;
6mod identity_id;
7mod job_id;
8mod object_id;
9mod role_id;
10mod service_id;
11mod task_id;
12
13pub use apikey_id::*;
14pub use case_id::*;
15pub use context_id::*;
16pub use execution_id::*;
17pub use feed_id::*;
18pub use identity_id::*;
19pub use job_id::*;
20pub use object_id::*;
21use rand::distr::{
22    uniform::{UniformChar, UniformSampler},
23    Uniform,
24};
25pub use role_id::*;
26pub use service_id::*;
27pub use task_id::*;
28
29pub trait ShortId {
30    fn to_short_id(&self) -> String;
31}
32
33fn generate_internal_id() -> String {
34    const DEFAULT_LENGTH: usize = 8;
35    use rand::prelude::*;
36    let mut rng = rand::rng();
37    // generate the first non-numeric character
38    let first_char: char = loop {
39        let c: char = rng.sample(rand::distr::Alphanumeric) as char;
40        if c.is_alphabetic() {
41            break c;
42        }
43    };
44    // generate DEFAULT_LENGTH-1 random alphanumeric characters
45    let mut id: Vec<char> = (0..DEFAULT_LENGTH - 1)
46        .map(|_| rng.sample(rand::distr::Alphanumeric) as char)
47        .collect();
48    id.insert(0, first_char);
49    id.into_iter().collect::<String>().to_lowercase()
50}
51
52#[test]
53fn test_generate_id_string() {
54    let id = generate_internal_id();
55    println!("id: {}", id);
56    assert_eq!(id.len(), 8);
57    let c = id.chars().next().unwrap();
58    assert!(c.is_alphabetic());
59}