amagi 0.1.4

Rust SDK, CLI, and Web API service skeleton for multi-platform social web adapters.
Documentation
use crate::platforms::internal::random::{PseudoRandom, base36_u64, now_unix_ms};

use super::super::config::Config;

pub(crate) fn generate_b3_trace_id(random: &mut PseudoRandom, config: &Config) -> String {
    let hex_chars = config.hex_chars.as_bytes();
    let mut output = String::with_capacity(config.b3_trace_id_length);
    for _ in 0..config.b3_trace_id_length {
        output.push(hex_chars[random.next_mod(hex_chars.len() as u32) as usize] as char);
    }
    output
}

pub(crate) fn generate_xray_trace_id(
    random: &mut PseudoRandom,
    config: &Config,
    timestamp_ms: Option<u64>,
    seq: Option<u32>,
) -> String {
    let timestamp = timestamp_ms.unwrap_or_else(now_unix_ms);
    let sequence = seq.unwrap_or_else(|| random.next_mod(config.xray_trace_id_seq_max + 1));
    let combined = ((timestamp as u128) << config.xray_trace_id_timestamp_shift) | sequence as u128;
    let part1 = format!(
        "{combined:0width$x}",
        width = config.xray_trace_id_part1_length
    );

    let hex_chars = config.hex_chars.as_bytes();
    let mut part2 = String::with_capacity(config.xray_trace_id_part2_length);
    for _ in 0..config.xray_trace_id_part2_length {
        part2.push(hex_chars[random.next_mod(hex_chars.len() as u32) as usize] as char);
    }

    format!("{part1}{part2}")
}

pub(crate) fn generate_search_id(timestamp_ms: u64, random_value: u32) -> String {
    format!(
        "{}{}",
        (timestamp_ms as u128) << 64,
        base36_u64(random_value as u64)
    )
}