feat: Add Default implementation for Harmony Id along with documentation. #53
							
								
								
									
										8
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										8
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							| @ -1431,6 +1431,7 @@ dependencies = [ | ||||
|  "harmony_macros", | ||||
|  "harmony_types", | ||||
|  "helm-wrapper-rs", | ||||
|  "hex", | ||||
|  "http 1.3.1", | ||||
|  "inquire", | ||||
|  "k3d-rs", | ||||
| @ -1442,6 +1443,7 @@ dependencies = [ | ||||
|  "non-blank-string-rs", | ||||
|  "opnsense-config", | ||||
|  "opnsense-config-xml", | ||||
|  "rand 0.9.1", | ||||
|  "reqwest 0.11.27", | ||||
|  "russh", | ||||
|  "rust-ipmi", | ||||
| @ -1566,6 +1568,12 @@ version = "0.3.9" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "hex" | ||||
| version = "0.4.3" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "hex-literal" | ||||
| version = "0.4.1" | ||||
|  | ||||
| @ -6,6 +6,8 @@ readme.workspace = true | ||||
| license.workspace = true | ||||
| 
 | ||||
| [dependencies] | ||||
| rand = "0.9" | ||||
| hex = "0.4" | ||||
| libredfish = "0.1.1" | ||||
| reqwest = { version = "0.11", features = ["blocking", "json"] } | ||||
| russh = "0.45.0" | ||||
|  | ||||
| @ -1,5 +1,23 @@ | ||||
| use std::time::SystemTime; | ||||
| use std::time::UNIX_EPOCH; | ||||
| use rand::distr::Alphanumeric; | ||||
| use rand::distr::SampleString; | ||||
| 
 | ||||
| use serde::{Deserialize, Serialize}; | ||||
| 
 | ||||
| /// A unique identifier designed for ease of use.
 | ||||
| ///
 | ||||
| /// You can pass it any String to use and Id, or you can use the default format with `Id::default()`
 | ||||
| ///
 | ||||
| /// The default format looks like this
 | ||||
| ///
 | ||||
| /// `462d4c_g2COgai`
 | ||||
| ///
 | ||||
| /// The first part is the unix timesamp in hexadecimal which makes Id easily sorted by creation time.
 | ||||
| /// Second part is a serie of 7 random characters.
 | ||||
| ///
 | ||||
| /// **It is not meant to be very secure or unique**, it is suitable to generate up to 10 000 items per
 | ||||
| /// second with a reasonable collision rate of 0,000014 % as calculated by this calculator : https://kevingal.com/apps/collision.html
 | ||||
| #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] | ||||
| pub struct Id { | ||||
|     value: String, | ||||
| @ -19,6 +37,17 @@ impl std::fmt::Display for Id { | ||||
| 
 | ||||
| impl Default for Id { | ||||
|     fn default() -> Self { | ||||
|         todo!() | ||||
|         let start = SystemTime::now(); | ||||
|         let since_the_epoch = start | ||||
|             .duration_since(UNIX_EPOCH) | ||||
|             .expect("Time went backwards"); | ||||
|         let timestamp = since_the_epoch.as_secs(); | ||||
| 
 | ||||
|         let hex_timestamp = format!("{:x}", timestamp & 0xffffff); | ||||
| 
 | ||||
|         let random_part: String = Alphanumeric.sample_string(&mut rand::rng(), 7); | ||||
| 
 | ||||
|         let value = format!("{}_{}", hex_timestamp, random_part); | ||||
|         Self { value } | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user