@@ -15,7 +15,8 @@ use ethereum_types::U256;
15
15
use failure:: Fail ;
16
16
use futures:: future:: BoxFuture ;
17
17
use ordered_float:: OrderedFloat ;
18
- use serde:: { Deserialize , Serialize } ;
18
+ use serde:: { Deserialize , Deserializer , Serialize } ;
19
+ use core:: fmt:: Display ;
19
20
20
21
use partial_struct:: PartialStruct ;
21
22
use witnet_crypto:: {
@@ -1604,13 +1605,50 @@ pub struct ValueTransferOutput {
1604
1605
/// Address that will receive the value
1605
1606
pub pkh : PublicKeyHash ,
1606
1607
/// Transferred value in nanowits
1608
+ #[ serde(
1609
+ serialize_with = "u64_to_string" ,
1610
+ deserialize_with = "number_from_string"
1611
+ ) ]
1607
1612
pub value : u64 ,
1608
1613
/// The value attached to a time-locked output cannot be spent before the specified
1609
1614
/// timestamp. That is, they cannot be used as an input in any transaction of a
1610
1615
/// subsequent block proposed for an epoch whose opening timestamp predates the time lock.
1611
1616
pub time_lock : u64 ,
1612
1617
}
1613
1618
1619
+ pub fn u64_to_string < S > ( val : & u64 , serializer : S ) -> Result < S :: Ok , S :: Error >
1620
+ where
1621
+ S : serde:: Serializer ,
1622
+ {
1623
+ if serializer. is_human_readable ( ) {
1624
+ serializer. serialize_str ( & val. to_string ( ) )
1625
+ } else {
1626
+ serializer. serialize_u64 ( * val)
1627
+ }
1628
+ }
1629
+
1630
+ pub fn number_from_string < ' de , T , D > ( deserializer : D ) -> Result < T , D :: Error >
1631
+ where
1632
+ D : Deserializer < ' de > ,
1633
+ T : FromStr + serde:: Deserialize < ' de > ,
1634
+ <T as FromStr >:: Err : Display ,
1635
+ {
1636
+ #[ derive( Deserialize ) ]
1637
+ #[ serde( untagged) ]
1638
+ enum StringOrInt < T > {
1639
+ String ( String ) ,
1640
+ Number ( T ) ,
1641
+ }
1642
+ if deserializer. is_human_readable ( ) {
1643
+ match StringOrInt :: < T > :: deserialize ( deserializer) ? {
1644
+ StringOrInt :: String ( s) => s. parse :: < T > ( ) . map_err ( serde:: de:: Error :: custom) ,
1645
+ StringOrInt :: Number ( i) => Ok ( i) ,
1646
+ }
1647
+ } else {
1648
+ T :: deserialize ( deserializer)
1649
+ }
1650
+ }
1651
+
1614
1652
impl ValueTransferOutput {
1615
1653
#[ inline]
1616
1654
pub fn value ( & self ) -> u64 {
0 commit comments