feat: Add Default implementation for Harmony Id along with documentation.
This Id implementation is optimized for ease of use. Ids are prefixed with the unix epoch and suffixed with 7 alphanumeric characters. But Ids can also contain any String the user wants to pass it
This commit is contained in:
parent
ec17ccc246
commit
8e472e4c65
8
Cargo.lock
generated
8
Cargo.lock
generated
@ -1431,6 +1431,7 @@ dependencies = [
|
|||||||
"harmony_macros",
|
"harmony_macros",
|
||||||
"harmony_types",
|
"harmony_types",
|
||||||
"helm-wrapper-rs",
|
"helm-wrapper-rs",
|
||||||
|
"hex",
|
||||||
"http 1.3.1",
|
"http 1.3.1",
|
||||||
"inquire",
|
"inquire",
|
||||||
"k3d-rs",
|
"k3d-rs",
|
||||||
@ -1442,6 +1443,7 @@ dependencies = [
|
|||||||
"non-blank-string-rs",
|
"non-blank-string-rs",
|
||||||
"opnsense-config",
|
"opnsense-config",
|
||||||
"opnsense-config-xml",
|
"opnsense-config-xml",
|
||||||
|
"rand 0.9.1",
|
||||||
"reqwest 0.11.27",
|
"reqwest 0.11.27",
|
||||||
"russh",
|
"russh",
|
||||||
"rust-ipmi",
|
"rust-ipmi",
|
||||||
@ -1566,6 +1568,12 @@ version = "0.3.9"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
|
checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hex"
|
||||||
|
version = "0.4.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hex-literal"
|
name = "hex-literal"
|
||||||
version = "0.4.1"
|
version = "0.4.1"
|
||||||
|
@ -6,6 +6,8 @@ readme.workspace = true
|
|||||||
license.workspace = true
|
license.workspace = true
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
rand = "0.9"
|
||||||
|
hex = "0.4"
|
||||||
libredfish = "0.1.1"
|
libredfish = "0.1.1"
|
||||||
reqwest = { version = "0.11", features = ["blocking", "json"] }
|
reqwest = { version = "0.11", features = ["blocking", "json"] }
|
||||||
russh = "0.45.0"
|
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};
|
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)]
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
pub struct Id {
|
pub struct Id {
|
||||||
value: String,
|
value: String,
|
||||||
@ -19,6 +37,17 @@ impl std::fmt::Display for Id {
|
|||||||
|
|
||||||
impl Default for Id {
|
impl Default for Id {
|
||||||
fn default() -> Self {
|
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