diff --git a/src/lib.rs b/src/lib.rs index 056d76e..015d716 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,5 @@ +use std::time::{SystemTime, UNIX_EPOCH}; + #[derive(Debug)] pub enum Version { ENHANCED, @@ -62,7 +64,7 @@ impl Icechip { // the offset will get subtracted from the unix epoch before being used in the Icechip. pub fn set_epoch_offset(mut self, offset: u64) { - self.epoch = Some(offset); + self.epoch = Some(UNIX_EPOCH - offset); } pub fn tick(&self) -> Icechip { @@ -70,7 +72,68 @@ impl Icechip { - if current timestamp in relation to self does not equal self, return an updated value, else increment the sequence - if sequence is going to overflow, sleep 1 ms */ - todo!(); + match SystemTime::now().duration_since(UNIX_EPOCH) { + Ok(o) => { + match self.version { + Version::ENHANCED => { + let curr_ts = match self.epoch { + Some(s) => (o - s).checked_shl(23).unwrap().checked_shr(23).unwrap(), + None => o.checked_shl(23).unwrap().checked_shr(23).unwrap(), + } + if self.timestamp == curr_ts { + if (self.sequence_id + 1) > 1023 { + std::thread::sleep(std::time::Duration::from_millis(1)); + return self.tick(); + } else { + return Icechip { + version: self.version.clone(), + timestamp: self.timestamp.clone(), + machine_id: self.machine_id.clone(), + sequence_id: self.sequence_id.clone() + 1, + epoch: self.epoch.clone() + } + } + } else { + return Icechip { + version: self.version.clone(), + timestamp: curr_ts.clone(), + machine_id: self.machine_id.clone(), + sequence_id: 0, + epoch: self.epoch.clone() + } + } + }, + Version::EXTENDED => { + if self.timestamp == o { + if (self.sequence_id + 1) > u32::MAX { + std::thread::sleep(std::time:Duration::from_millis(1)); + return self.tick(); + } else { + return Icechip { + version: self.version.clone(), + timestamp: self.timestamp.clone(), + machine_id: self.machine_id.clone(), + sequence_id: self.sequence_id.clone() + 1, + epoch: self.epoch.clone() + } + } + } else { + return Icechip { + version: self.version.clone(), + timestamp: o.clone(), + machine_id: self.machine_id.clone(), + sequence_id: 0, + epoch: self.epoch.clone() + } + } + }, + } + }, + Err(_) => { + std::thread::sleep(std::time::Duration::from_millis(1)); + return self.tick(); + } + } } pub fn with_id(machine_id: u32, version: Version) -> Icechip {