11use core:: fmt;
22
3+ use schemars:: JsonSchema ;
4+ use serde:: { de, ser, Deserialize , Deserializer , Serialize } ;
35use sha2:: { Digest , Sha256 } ;
46use thiserror:: Error ;
57
@@ -10,8 +12,8 @@ use crate::{StdError, StdResult};
1012///
1113/// This is often referred to as "code ID" in go-cosmwasm, even if code ID
1214/// usually refers to an auto-incrementing number.
13- #[ derive( Debug , Copy , Clone , PartialEq , Eq , Hash ) ]
14- pub struct Checksum ( [ u8 ; 32 ] ) ;
15+ #[ derive( JsonSchema , Debug , Copy , Clone , PartialEq , Eq , Hash ) ]
16+ pub struct Checksum ( # [ schemars ( with = "String" ) ] [ u8 ; 32 ] ) ;
1517
1618impl Checksum {
1719 pub fn generate ( wasm : & [ u8 ] ) -> Self {
@@ -50,6 +52,46 @@ impl From<[u8; 32]> for Checksum {
5052 }
5153}
5254
55+ /// Serializes as a hex string
56+ impl Serialize for Checksum {
57+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
58+ where
59+ S : ser:: Serializer ,
60+ {
61+ serializer. serialize_str ( & self . to_hex ( ) )
62+ }
63+ }
64+
65+ /// Deserializes as a hex string
66+ impl < ' de > Deserialize < ' de > for Checksum {
67+ fn deserialize < D > ( deserializer : D ) -> Result < Checksum , D :: Error >
68+ where
69+ D : Deserializer < ' de > ,
70+ {
71+ deserializer. deserialize_str ( ChecksumVisitor )
72+ }
73+ }
74+
75+ struct ChecksumVisitor ;
76+
77+ impl < ' de > de:: Visitor < ' de > for ChecksumVisitor {
78+ type Value = Checksum ;
79+
80+ fn expecting ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
81+ formatter. write_str ( "valid hex encoded 32 byte checksum" )
82+ }
83+
84+ fn visit_str < E > ( self , v : & str ) -> Result < Self :: Value , E >
85+ where
86+ E : de:: Error ,
87+ {
88+ match Checksum :: from_hex ( v) {
89+ Ok ( data) => Ok ( data) ,
90+ Err ( _) => Err ( E :: custom ( format ! ( "invalid checksum: {v}" ) ) ) ,
91+ }
92+ }
93+ }
94+
5395#[ derive( Error , Debug ) ]
5496#[ error( "Checksum not of length 32" ) ]
5597pub struct ChecksumError ;
0 commit comments