idgen_rs 0.1.0

A simple snowflake ID generator from idgen_go
Documentation
use std::sync::MutexGuard;
use crate::id_generator_options::IdGeneratorOptions;
use crate::isnow_worker::ISnowWorker;
use crate::snow_worker_m1::SnowWorkerM1;

pub struct SnowWorkerM2 {
    base: SnowWorkerM1,
}

impl SnowWorkerM2 {
    pub fn new(options: &IdGeneratorOptions) -> Self {
        SnowWorkerM2 {
            base: SnowWorkerM1::new(options),
        }
    }

    pub fn next_id(&mut self) -> i64 {
        let _lock: MutexGuard<()> = self.base.lock.lock().unwrap();
        let mut current_time_tick = self.base.get_current_time_tick();
        if self.base.last_time_tick == current_time_tick {
            self.base.current_seq_number += 1;
            if self.base.current_seq_number > self.base.max_seq_number {
                self.base.current_seq_number = self.base.min_seq_number;
                current_time_tick = self.base.get_next_time_tick();
            }
        } else {
            self.base.current_seq_number = self.base.min_seq_number;
        }
        if current_time_tick < self.base.last_time_tick {
            println!(
                "Time error for {} milliseconds",
                self.base.last_time_tick - current_time_tick
            );
        }
        self.base.last_time_tick = current_time_tick;
        
        (current_time_tick << self.base.timestamp_shift)
            + (self.base.worker_id << self.base.seq_bit_length) as i64
            + self.base.current_seq_number as i64
    }
}


impl ISnowWorker for SnowWorkerM2 {
    fn next_id(&mut self) -> i64 {
        SnowWorkerM2::next_id(self)
    }
}