Added functions from a private repo I've been working on

This commit is contained in:
Louis Hollingworth 2024-05-16 12:35:59 +01:00
parent c27ee83cec
commit 5b90b7bb95
Signed by: lucxjo
GPG key ID: A11415CB3DC7809B
3 changed files with 208 additions and 11 deletions

154
Cargo.lock generated Normal file
View file

@ -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"

View file

@ -1,6 +1,14 @@
[package]
name = "suid"
version = "0.1.0"
version = "0.2.0"
edition = "2021"
publish = ["ludogit"]
authors = ["Louis Hollingworth <louis@hollingworth.nl>"]
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"

View file

@ -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;
}
}