diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..c25f598 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,154 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "libc" +version = "0.2.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro2" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "suid" +version = "0.2.0" +dependencies = [ + "rand", + "tracing", +] + +[[package]] +name = "syn" +version = "2.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf5be731623ca1a1fb7d8be6f261a3be6d3e2337b8a1f97be944d020c8fcb704" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" diff --git a/Cargo.toml b/Cargo.toml index 427a699..1dedda4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,14 @@ [package] name = "suid" -version = "0.1.0" +version = "0.2.0" edition = "2021" +publish = ["ludogit"] +authors = ["Louis Hollingworth "] +description = "A simple unique id library" +readme = "README.md" +repository = "https://git.ludoviko.ch/lucxjo/suid" +license = "AGPL-3.0-or-later" [dependencies] +rand = "0.8.5" +tracing = "0.1.40" diff --git a/src/lib.rs b/src/lib.rs index 7d12d9a..0ea4404 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,14 +1,49 @@ -pub fn add(left: usize, right: usize) -> usize { - left + right -} +const BYTE_LENGTH: usize = 20; -#[cfg(test)] -mod tests { - use super::*; +pub type Bytes = [u8; BYTE_LENGTH]; - #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); +#[derive(Clone, Copy, PartialEq, PartialOrd, Ord, Hash, Eq)] +pub struct SUID(Bytes); + +impl SUID { + /// Generates an SUID using SystemTime and a random string. + /// The total length of the byte array will be 20. + pub fn new() -> Self { + use rand::distributions::{Alphanumeric, DistString}; + + let time = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_micros(); + let mut bytes: Bytes = [0; BYTE_LENGTH]; + let b_string = format!( + "{}{}", + time, + Alphanumeric.sample_string(&mut rand::thread_rng(), 4) + ); + let b = b_string.as_bytes(); + + if b.len() != BYTE_LENGTH { + tracing::error!("Byte length wrong. Length = {}", b.len()); + } + + bytes.copy_from_slice(b); + Self(bytes) + } + /// Parses an SUID as hex. + /// Use as_string instead. + pub fn parse(self) -> String { + format!("{:02x?}", self.0) + } + + /// Returns an SUID as a hexadecimal string. + pub fn as_string(self) -> String { + let mut string = "".to_string(); + + for v in self.0 { + string = format!("{}{:02x?}", string, v); + } + + return string; } }