1
1
use std:: error:: Error ;
2
2
use std:: fmt;
3
3
use std:: ops:: Deref ;
4
+ use std:: str:: FromStr ;
4
5
5
6
use chrono:: serde:: { ts_milliseconds, ts_milliseconds_option, ts_seconds} ;
6
7
use chrono:: { DateTime , Utc } ;
@@ -14,7 +15,7 @@ use hex::{FromHex, FromHexError};
14
15
#[ serde( transparent) ]
15
16
pub struct ChannelId (
16
17
#[ serde(
17
- deserialize_with = "channel_id_from_str " ,
18
+ deserialize_with = "deserialize_channel_id " ,
18
19
serialize_with = "SerHex::<StrictPfx>::serialize"
19
20
) ]
20
21
[ u8 ; 32 ] ,
@@ -26,16 +27,25 @@ impl fmt::Debug for ChannelId {
26
27
}
27
28
}
28
29
29
- fn channel_id_from_str < ' de , D > ( deserializer : D ) -> Result < [ u8 ; 32 ] , D :: Error >
30
+ fn deserialize_channel_id < ' de , D > ( deserializer : D ) -> Result < [ u8 ; 32 ] , D :: Error >
30
31
where
31
32
D : Deserializer < ' de > ,
32
33
{
33
34
let channel_id = String :: deserialize ( deserializer) ?;
34
- if channel_id. is_empty ( ) || channel_id. len ( ) != 66 {
35
- return Err ( serde:: de:: Error :: custom ( "invalid channel id" . to_string ( ) ) ) ;
36
- }
35
+ validate_channel_id ( & channel_id) . map_err ( serde:: de:: Error :: custom)
36
+ }
37
37
38
- <[ u8 ; 32 ] as FromHex >:: from_hex ( & channel_id[ 2 ..] ) . map_err ( serde:: de:: Error :: custom)
38
+ fn validate_channel_id ( s : & str ) -> Result < [ u8 ; 32 ] , FromHexError > {
39
+ match ( s. get ( 0 ..2 ) , s. get ( 2 ..) ) {
40
+ ( Some ( prefix) , Some ( hex) ) => {
41
+ if hex. len ( ) != 64 || prefix != "0x" {
42
+ Err ( FromHexError :: InvalidStringLength )
43
+ } else {
44
+ Ok ( <[ u8 ; 32 ] as FromHex >:: from_hex ( s) ?)
45
+ }
46
+ }
47
+ _ => Err ( FromHexError :: InvalidStringLength ) ,
48
+ }
39
49
}
40
50
41
51
impl Deref for ChannelId {
@@ -74,6 +84,14 @@ impl fmt::Display for ChannelId {
74
84
}
75
85
}
76
86
87
+ impl FromStr for ChannelId {
88
+ type Err = FromHexError ;
89
+
90
+ fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
91
+ ChannelId :: from_hex ( validate_channel_id ( s) ?)
92
+ }
93
+ }
94
+
77
95
#[ derive( Serialize , Deserialize , Debug , Clone , PartialEq ) ]
78
96
#[ serde( rename_all = "camelCase" ) ]
79
97
pub struct Channel {
0 commit comments