Skip to content

Commit

Permalink
Move to a lowercase alphabet
Browse files Browse the repository at this point in the history
Signed-off-by: Adrian Tombu <[email protected]>
  • Loading branch information
adriantombu committed Jul 10, 2024
1 parent cb35915 commit a654057
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 43 deletions.
53 changes: 31 additions & 22 deletions src/base32.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,23 @@ use core::fmt;
/// Length of a string-encoded Ulys
pub const ULYS_LEN: usize = 26;

const ALPHABET: &[u8; 32] = b"0123456789ABCDEFGHJKMNPQRSTVWXYZ";
const ALPHABET: &[u8; 32] = b"0123456789abcdefghjkmnpqrstvwxyz";

const NO_VALUE: u8 = 255;
const LOOKUP: [u8; 256] = [
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255, 255, 255,
255, 255, 255, 255, 10, 11, 12, 13, 14, 15, 16, 17, 255, 18, 19, 255, 20, 21, 255, 22, 23, 24,
25, 26, 255, 27, 28, 29, 30, 31, 255, 255, 255, 255, 255, 255, 10, 11, 12, 13, 14, 15, 16, 17,
255, 18, 19, 255, 20, 21, 255, 22, 23, 24, 25, 26, 255, 27, 28, 29, 30, 31, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 10, 11,
12, 13, 14, 15, 16, 17, 255, 18, 19, 255, 20, 21, 255, 22, 23, 24, 25, 26, 255, 27, 28, 29, 30,
31, 255, 255, 255, 255, 255, 255, 10, 11, 12, 13, 14, 15, 16, 17, 255, 18, 19, 255, 20, 21,
255, 22, 23, 24, 25, 26, 255, 27, 28, 29, 30, 31, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
];

/// Generator code for `LOOKUP`
Expand Down Expand Up @@ -148,12 +148,12 @@ mod tests {

#[test]
fn test_valid() {
let val = 0x41414141414141414141414141414141;
assert_eq!(decode("21850M2GA1850M2GA1850M2GA1").unwrap(), val);
assert_eq!(encode(val), "21850M2GA1850M2GA1850M2GA1");
let val = 0x4141_4141_4141_4141_4141_4141_4141_4141;
assert_eq!(decode("21850m2ga1850m2ga1850m2ga1").unwrap(), val);
assert_eq!(encode(val), "21850m2ga1850m2ga1850m2ga1");

let val = 0x4d4e385051444a59454234335a413756;
let enc = "2D9RW50MA499CMAGHM6DD42DTP";
let val = 0x4d4e_3850_5144_4a59_4542_3433_5a41_3756;
let enc = "2d9rw50ma499cmaghm6dd42dtp";
let lower = enc.to_lowercase();
assert_eq!(encode(val), enc);
assert_eq!(decode(enc).unwrap(), val);
Expand All @@ -162,43 +162,52 @@ mod tests {

#[test]
fn test_length() {
assert_eq!(encode(0xffffffffffffffffffffffffffffffff).len(), ULYS_LEN);
assert_eq!(encode(0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f).len(), ULYS_LEN);
assert_eq!(encode(0x00000000000000000000000000000000).len(), ULYS_LEN);
assert_eq!(
encode(0xffff_ffff_ffff_ffff_ffff_ffff_ffff_ffff).len(),
ULYS_LEN
);
assert_eq!(
encode(0x0f0f_0f0f_0f0f_0f0f_0f0f_0f0f_0f0f_0f0f).len(),
ULYS_LEN
);
assert_eq!(
encode(0x0000_0000_0000_0000_0000_0000_0000_0000).len(),
ULYS_LEN
);

assert_eq!(decode(""), Err(DecodeError::InvalidLength));
assert_eq!(
decode("2D9RW50MA499CMAGHM6DD42DT"),
decode("2d9rw50ma499cmaghm6dd42dt"),
Err(DecodeError::InvalidLength)
);
assert_eq!(
decode("2D9RW50MA499CMAGHM6DD42DTPP"),
decode("2d9rw50ma499cmaghm6dd42dtpP"),
Err(DecodeError::InvalidLength)
);
}

#[test]
fn test_chars() {
for ref c in encode(0xffffffffffffffffffffffffffffffff).bytes() {
for ref c in encode(0xffff_ffff_ffff_ffff_ffff_ffff_ffff_ffff).bytes() {
assert!(ALPHABET.contains(c));
}
for ref c in encode(0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f).bytes() {
for ref c in encode(0x0f0f_0f0f_0f0f_0f0f_0f0f_0f0f_0f0f_0f0f).bytes() {
assert!(ALPHABET.contains(c));
}
for ref c in encode(0x00000000000000000000000000000000).bytes() {
for ref c in encode(0x0000_0000_0000_0000_0000_0000_0000_0000).bytes() {
assert!(ALPHABET.contains(c));
}

assert_eq!(
decode("2D9RW50[A499CMAGHM6DD42DTP"),
decode("2d9rw50[a499cmaghm6dd42dtp"),
Err(DecodeError::InvalidChar)
);
assert_eq!(
decode("2D9RW50LA499CMAGHM6DD42DTP"),
decode("2d9rw50la499cmaghm6dd42dtp"),
Err(DecodeError::InvalidChar)
);
assert_eq!(
decode("2D9RW50IA499CMAGHM6DD42DTP"),
decode("2d9rw50ia499cmaghm6dd42dtp"),
Err(DecodeError::InvalidChar)
);
}
Expand Down
40 changes: 20 additions & 20 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ impl Ulys {
/// ```rust
/// use ulys::Ulys;
///
/// let ulys = Ulys::from_string("01D39ZY06FGSCTVN4T2V9PKHFZ").unwrap();
/// let ulys = Ulys::from_string("01d39zy06fgsctvn4t2v9pkhfz").unwrap();
///
/// let ulys2 = Ulys::from_parts(ulys.timestamp_ms(), ulys.random());
///
Expand All @@ -104,14 +104,14 @@ impl Ulys {

/// Creates a Ulys from a Crockford Base32 encoded string
///
/// An DecodeError will be returned when the given string is not formatted
/// An `DecodeError` will be returned when the given string is not formatted
/// properly.
///
/// # Example
/// ```rust
/// use ulys::Ulys;
///
/// let text = "01D39ZY06FGSCTVN4T2V9PKHFZ";
/// let text = "01d39zy06fgsctvn4t2v9pkhfz";
/// let result = Ulys::from_string(text);
///
/// assert!(result.is_ok());
Expand Down Expand Up @@ -168,7 +168,7 @@ impl Ulys {
/// ```rust
/// use ulys::Ulys;
///
/// let text = "01D39ZY06FGSCTVN4T2V9PKHFZ";
/// let text = "01d39zy06fgsctvn4t2v9pkhfz";
/// let ulys = Ulys::from_string(text).unwrap();
/// let ulys_next = ulys.increment().unwrap();
///
Expand All @@ -184,11 +184,11 @@ impl Ulys {
/// ```rust
/// use ulys::Ulys;
///
/// let text = "01D39ZY06FGSCTVN4T2V9PKHFZ";
/// let text = "01d39zy06fgsctvn4t2v9pkhfz";
/// let ulys = Ulys::from_string(text).unwrap();
///
/// let mut buf = [0; ulys::ULYS_LEN];
/// let new_text = ulys.to_str(&mut buf).unwrap();
/// let new_text = ulys.array_to_str(&mut buf);
///
/// assert_eq!(new_text, text);
/// ```
Expand All @@ -205,7 +205,7 @@ impl Ulys {
/// ```rust
/// use ulys::Ulys;
///
/// let text = "01D39ZY06FGSCTVN4T2V9PKHFZ";
/// let text = "01d39zy06fgsctvn4t2v9pkhfz";
/// let ulys = Ulys::from_string(text).unwrap();
///
/// let mut buf = [0; ulys::ULYS_LEN];
Expand All @@ -224,7 +224,7 @@ impl Ulys {
/// ```rust
/// use ulys::Ulys;
///
/// let text = "01D39ZY06FGSCTVN4T2V9PKHFZ";
/// let text = "01d39zy06fgsctvn4t2v9pkhfz";
/// let ulys = Ulys::from_string(text).unwrap();
///
/// assert_eq!(&ulys.to_string(), text);
Expand Down Expand Up @@ -276,7 +276,7 @@ impl Ulys {
///
/// assert_eq!(
/// ulys.to_string(),
/// "7ZZZZZZZZZZZZZZZZZZZZZZZZZ"
/// "7zzzzzzzzzzzzzzzzzzzzzzzzz"
/// );
/// ```
pub const fn from_bytes(bytes: [u8; 16]) -> Ulys {
Expand All @@ -289,7 +289,7 @@ impl Ulys {
/// ```
/// use ulys::Ulys;
///
/// let text = "7ZZZZZZZZZZZZZZZZZZZZZZZZZ";
/// let text = "7zzzzzzzzzzzzzzzzzzzzzzzzz";
/// let ulys = Ulys::from_string(text).unwrap();
///
/// assert_eq!(ulys.to_bytes(), [0xFF; 16]);
Expand Down Expand Up @@ -369,35 +369,35 @@ mod tests {

#[test]
fn test_static() {
let s = Ulys(0x41414141414141414141414141414141).to_string();
let s = Ulys(0x4141_4141_4141_4141_4141_4141_4141_4141).to_string();
let u = Ulys::from_string(&s).unwrap();
assert_eq!(&s, "21850M2GA1850M2GA1850M2GA1");
assert_eq!(u.0, 0x41414141414141414141414141414141);
assert_eq!(&s, "21850m2ga1850m2ga1850m2ga1");
assert_eq!(u.0, 0x4141_4141_4141_4141_4141_4141_4141_4141);
}

#[test]
fn test_increment() {
let ulys = Ulys::from_string("01BX5ZZKBKAZZZZZZZZZZZZZZZ").unwrap();
let ulys = Ulys::from_string("01bx5zzkbkazzzzzzzzzzzzzzz").unwrap();
let ulys = ulys.increment().unwrap();
assert_eq!("01BX5ZZKBKB000000000000000", ulys.to_string());
assert_eq!("01bx5zzkbkb000000000000000", ulys.to_string());

let ulys = Ulys::from_string("01BX5ZZKBKZZZZZZZZZZZZZZZX").unwrap();
let ulys = Ulys::from_string("01bx5zzkbkzzzzzzzzzzzzzzzx").unwrap();
let ulys = ulys.increment().unwrap();
assert_eq!("01BX5ZZKBKZZZZZZZZZZZZZZZY", ulys.to_string());
assert_eq!("01bx5zzkbkzzzzzzzzzzzzzzzy", ulys.to_string());
let ulys = ulys.increment().unwrap();
assert_eq!("01BX5ZZKBKZZZZZZZZZZZZZZZZ", ulys.to_string());
assert_eq!("01bx5zzkbkzzzzzzzzzzzzzzzz", ulys.to_string());
assert!(ulys.increment().is_none());
}

#[test]
fn test_increment_overflow() {
let ulys = Ulys(u128::max_value());
let ulys = Ulys(u128::MAX);
assert!(ulys.increment().is_none());
}

#[test]
fn can_into_thing() {
let ulys = Ulys::from_str("01FKMG6GAG0PJANMWFN84TNXCD").unwrap();
let ulys = Ulys::from_str("01fkmg6gag0pjanmwfn84tnxcd").unwrap();
let s: String = ulys.into();
let u: u128 = ulys.into();
let uu: (u64, u64) = ulys.into();
Expand Down
2 changes: 1 addition & 1 deletion src/uuid.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ mod test {
#[test]
fn uuid_str_cycle() {
let uuid_txt = "771a3bce-02e9-4428-a68e-b1e7e82b7f9f";
let ulys_txt = "3Q38XWW0Q98GMAD3NHWZM2PZWZ";
let ulys_txt = "3q38xww0q98gmad3nhwzm2pzwz";

let ulys: Ulys = Uuid::parse_str(uuid_txt).unwrap().into();
assert_eq!(ulys.to_string(), ulys_txt);
Expand Down

0 comments on commit a654057

Please sign in to comment.