11// This is free and unencumbered software released into the public domain.
22
33use crate :: { IdClass , IdError } ;
4- use core:: { ops :: RangeInclusive , str:: FromStr } ;
4+ use core:: { str:: FromStr } ;
55use derive_more:: Display ;
66
7- pub const ID_LENGTH_MIN : usize = 1 + 16 ;
8- pub const ID_LENGTH_MAX : usize = 1 + 22 ;
9- pub const ID_LENGTH : RangeInclusive < usize > = ID_LENGTH_MIN ..=ID_LENGTH_MAX ;
10-
117#[ derive( Clone , Debug , Display , Eq , Hash , Ord , PartialEq , PartialOrd ) ]
128#[ display( "{class}{}" , bs58:: encode( bytes) . into_string( ) ) ]
13- pub struct Id {
9+ pub struct Id < const N : usize = 16 > {
1410 pub ( crate ) class : IdClass ,
15- pub ( crate ) bytes : [ u8 ; 16 ] ,
11+ pub ( crate ) bytes : [ u8 ; N ] ,
1612}
1713
18- impl Id {
14+ impl < const N : usize > Id < N > {
1915 pub fn zero ( class : IdClass ) -> Self {
2016 Self {
2117 class,
22- bytes : [ 0u8 ; 16 ] ,
23- }
24- }
25-
26- pub fn new ( class : IdClass ) -> Self {
27- Self {
28- class,
29- bytes : uuid:: Uuid :: now_v7 ( ) . into_bytes ( ) ,
18+ bytes : [ 0u8 ; N ] ,
3019 }
3120 }
3221
@@ -38,18 +27,10 @@ impl Id {
3827 self . bytes . as_slice ( )
3928 }
4029
41- pub fn as_uuid ( & self ) -> uuid:: Uuid {
42- uuid:: Uuid :: from_bytes ( self . bytes )
43- }
44-
45- pub fn into_bytes ( self ) -> [ u8 ; 16 ] {
30+ pub fn into_bytes ( self ) -> [ u8 ; N ] {
4631 self . bytes
4732 }
4833
49- pub fn into_uuid ( self ) -> uuid:: Uuid {
50- uuid:: Uuid :: from_bytes ( self . bytes )
51- }
52-
5334 #[ cfg( feature = "std" ) ]
5435 pub fn yaml_path ( & self ) -> std:: path:: PathBuf {
5536 self . dir_path ( ) . join ( self . class ( ) . yaml_path ( ) )
@@ -73,21 +54,39 @@ impl Id {
7354 }
7455}
7556
76- impl From < ( IdClass , [ u8 ; 16 ] ) > for Id {
77- fn from ( ( class, bytes) : ( IdClass , [ u8 ; 16 ] ) ) -> Self {
57+ impl Id < 16 > {
58+ pub fn new_uuid ( class : IdClass ) -> Self {
59+ Self {
60+ class,
61+ bytes : uuid:: Uuid :: now_v7 ( ) . into_bytes ( ) ,
62+ }
63+ }
64+
65+ pub fn as_uuid ( & self ) -> uuid:: Uuid {
66+ uuid:: Uuid :: from_bytes ( self . bytes )
67+ }
68+
69+ pub fn into_uuid ( self ) -> uuid:: Uuid {
70+ uuid:: Uuid :: from_bytes ( self . bytes )
71+ }
72+ }
73+
74+ impl < const N : usize > From < ( IdClass , [ u8 ; N ] ) > for Id < N > {
75+ fn from ( ( class, bytes) : ( IdClass , [ u8 ; N ] ) ) -> Self {
7876 Self { class, bytes }
7977 }
8078}
8179
82- impl From < ( IdClass , & Vec < u8 > ) > for Id {
80+ impl < const N : usize > From < ( IdClass , & Vec < u8 > ) > for Id < N > {
8381 fn from ( ( class, bytes_vec) : ( IdClass , & Vec < u8 > ) ) -> Self {
84- let mut bytes = [ 0u8 ; 16 ] ;
85- bytes[ 0 ..] . copy_from_slice ( & bytes_vec[ 0 ..16 ] ) ;
82+ let mut bytes = [ 0u8 ; N ] ;
83+ let len = N . min ( bytes_vec. len ( ) ) ;
84+ bytes[ ..len] . copy_from_slice ( & bytes_vec[ ..len] ) ;
8685 Self { class, bytes }
8786 }
8887}
8988
90- impl FromStr for Id {
89+ impl < const N : usize > FromStr for Id < N > {
9190 type Err = IdError ;
9291
9392 fn from_str ( input : & str ) -> Result < Self , Self :: Err > {
@@ -112,22 +111,22 @@ impl FromStr for Id {
112111}
113112
114113#[ cfg( feature = "eloquent" ) ]
115- impl eloquent:: ToSql for Id {
114+ impl < const N : usize > eloquent:: ToSql for Id < N > {
116115 fn to_sql ( & self ) -> Result < String , eloquent:: error:: EloquentError > {
117116 let hex: String = self . bytes . iter ( ) . map ( |b| format ! ( "{b:02X}" ) ) . collect ( ) ;
118117 Ok ( format ! ( "X'{hex}'" ) )
119118 }
120119}
121120
122121#[ cfg( feature = "libsql" ) ]
123- impl libsql:: params:: IntoValue for Id {
122+ impl < const N : usize > libsql:: params:: IntoValue for Id < N > {
124123 fn into_value ( self ) -> libsql:: Result < libsql:: Value > {
125124 Ok ( libsql:: Value :: Blob ( self . bytes . to_vec ( ) ) )
126125 }
127126}
128127
129128#[ cfg( feature = "rocket" ) ]
130- impl < ' r > rocket:: request:: FromParam < ' r > for Id {
129+ impl < ' r , const N : usize > rocket:: request:: FromParam < ' r > for Id < N > {
131130 type Error = IdError ;
132131
133132 fn from_param ( input : & ' r str ) -> Result < Self , Self :: Error > {
@@ -136,7 +135,7 @@ impl<'r> rocket::request::FromParam<'r> for Id {
136135}
137136
138137#[ cfg( feature = "turso" ) ]
139- impl turso:: IntoValue for Id {
138+ impl < const N : usize > turso:: IntoValue for Id < N > {
140139 fn into_value ( self ) -> turso:: Result < turso:: Value > {
141140 Ok ( turso:: Value :: Blob ( self . bytes . to_vec ( ) ) )
142141 }
0 commit comments