1
1
use std:: { convert:: TryFrom , marker:: PhantomData } ;
2
2
3
- use crate :: { balances_map:: UnifiedMap , channel_v5:: Channel , Address , UnifiedNum } ;
4
- use chrono:: { DateTime , Utc } ;
5
- use serde:: { Deserialize , Deserializer , Serialize } ;
3
+ use crate :: { Address , UnifiedMap , UnifiedNum } ;
4
+ use serde:: { de:: DeserializeOwned , Deserialize , Serialize } ;
6
5
use thiserror:: Error ;
7
6
8
- #[ derive( Serialize , Debug , Clone , PartialEq , Eq ) ]
9
- #[ serde( rename_all = "camelCase" ) ]
10
- pub struct Accounting < S : BalancesState > {
11
- pub channel : Channel ,
12
- #[ serde( flatten) ]
13
- pub balances : Balances < S > ,
14
- pub updated : Option < DateTime < Utc > > ,
15
- pub created : DateTime < Utc > ,
16
- }
17
-
18
7
#[ derive( Serialize , Debug , Clone , PartialEq , Eq , Default ) ]
19
8
#[ serde( rename_all = "camelCase" ) ]
20
- pub struct Balances < S > {
9
+ pub struct Balances < S : BalancesState > {
21
10
pub earners : UnifiedMap ,
22
11
pub spenders : UnifiedMap ,
23
- #[ serde( skip_serializing, skip_deserializing) ]
24
12
state : PhantomData < S > ,
25
13
}
26
14
@@ -82,6 +70,14 @@ impl<S: BalancesState> Balances<S> {
82
70
. entry ( earner)
83
71
. or_insert_with ( UnifiedNum :: default) ;
84
72
}
73
+
74
+ pub fn into_unchecked ( self ) -> Balances < UncheckedState > {
75
+ Balances {
76
+ earners : self . earners ,
77
+ spenders : self . spenders ,
78
+ state : PhantomData :: default ( ) ,
79
+ }
80
+ }
85
81
}
86
82
87
83
#[ derive( Debug , Error ) ]
@@ -103,15 +99,25 @@ pub enum Error {
103
99
} ,
104
100
}
105
101
106
- pub trait BalancesState { }
102
+ pub trait BalancesState : std:: fmt:: Debug + Eq + Clone + Serialize + DeserializeOwned {
103
+ fn from_unchecked ( balances : Balances < UncheckedState > ) -> Result < Balances < Self > , Error > ;
104
+ }
107
105
108
- #[ derive( Debug , Clone , PartialEq , Eq , Default ) ]
106
+ #[ derive( Debug , Clone , PartialEq , Eq , Default , Serialize , Deserialize ) ]
109
107
pub struct CheckedState ;
110
- impl BalancesState for CheckedState { }
108
+ impl BalancesState for CheckedState {
109
+ fn from_unchecked ( balances : Balances < UncheckedState > ) -> Result < Balances < Self > , Error > {
110
+ balances. check ( )
111
+ }
112
+ }
111
113
112
- #[ derive( Debug , Clone , PartialEq , Eq , Default ) ]
114
+ #[ derive( Debug , Clone , PartialEq , Eq , Default , Serialize , Deserialize ) ]
113
115
pub struct UncheckedState ;
114
- impl BalancesState for UncheckedState { }
116
+ impl BalancesState for UncheckedState {
117
+ fn from_unchecked ( balances : Balances < Self > ) -> Result < Balances < Self > , Error > {
118
+ Ok ( balances)
119
+ }
120
+ }
115
121
116
122
impl TryFrom < Balances < UncheckedState > > for Balances < CheckedState > {
117
123
type Error = Error ;
@@ -123,82 +129,30 @@ impl TryFrom<Balances<UncheckedState>> for Balances<CheckedState> {
123
129
124
130
/// This modules implements the needed non-generic structs that help with Deserialization of the `Balances<S>`
125
131
mod de {
126
- use super :: * ;
127
-
128
- #[ derive( Deserialize ) ]
129
- struct DeserializeAccounting {
130
- pub channel : Channel ,
131
- #[ serde( flatten) ]
132
- pub balances : DeserializeBalances ,
133
- pub created : DateTime < Utc > ,
134
- pub updated : Option < DateTime < Utc > > ,
135
- }
132
+ use serde:: Deserializer ;
136
133
137
- impl < ' de > Deserialize < ' de > for Accounting < UncheckedState > {
138
- fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
139
- where
140
- D : Deserializer < ' de > ,
141
- {
142
- let de_acc = DeserializeAccounting :: deserialize ( deserializer) ?;
143
-
144
- Ok ( Self {
145
- channel : de_acc. channel ,
146
- balances : Balances :: < UncheckedState > :: try_from ( de_acc. balances )
147
- . map_err ( serde:: de:: Error :: custom) ?,
148
- created : de_acc. created ,
149
- updated : de_acc. updated ,
150
- } )
151
- }
152
- }
153
-
154
- impl < ' de > Deserialize < ' de > for Accounting < CheckedState > {
155
- fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
156
- where
157
- D : Deserializer < ' de > ,
158
- {
159
- let unchecked_acc = Accounting :: < UncheckedState > :: deserialize ( deserializer) ?;
160
-
161
- Ok ( Self {
162
- channel : unchecked_acc. channel ,
163
- balances : unchecked_acc
164
- . balances
165
- . check ( )
166
- . map_err ( serde:: de:: Error :: custom) ?,
167
- created : unchecked_acc. created ,
168
- updated : unchecked_acc. updated ,
169
- } )
170
- }
171
- }
134
+ use super :: * ;
172
135
173
136
#[ derive( Deserialize , Debug , Clone , PartialEq , Eq ) ]
174
137
struct DeserializeBalances {
175
138
pub earners : UnifiedMap ,
176
139
pub spenders : UnifiedMap ,
177
140
}
178
141
179
- impl < ' de > Deserialize < ' de > for Balances < CheckedState > {
180
- fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
181
- where
182
- D : Deserializer < ' de > ,
183
- {
184
- let unchecked_balances = Balances :: < UncheckedState > :: deserialize ( deserializer) ?;
185
-
186
- unchecked_balances. check ( ) . map_err ( serde:: de:: Error :: custom)
187
- }
188
- }
189
-
190
- impl < ' de > Deserialize < ' de > for Balances < UncheckedState > {
142
+ impl < ' de , S : BalancesState > Deserialize < ' de > for Balances < S > {
191
143
fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
192
144
where
193
145
D : Deserializer < ' de > ,
194
146
{
195
147
let deser_balances = DeserializeBalances :: deserialize ( deserializer) ?;
196
148
197
- Ok ( Balances {
149
+ let unchecked_balances = Balances {
198
150
earners : deser_balances. earners ,
199
151
spenders : deser_balances. spenders ,
200
152
state : PhantomData :: < UncheckedState > :: default ( ) ,
201
- } )
153
+ } ;
154
+
155
+ S :: from_unchecked ( unchecked_balances) . map_err ( serde:: de:: Error :: custom)
202
156
}
203
157
}
204
158
0 commit comments