1
- use std:: marker:: PhantomData ;
2
-
3
1
use crate :: {
4
2
to_json_string, Coin , IbcCallbackRequest , IbcDstCallback , IbcMsg , IbcSrcCallback , IbcTimeout ,
5
3
} ;
6
4
7
- // these are the different states the TransferMsgBuilder can be in
5
+ // these are the different memo types and at the same time the states
6
+ // the TransferMsgBuilder can be in
8
7
#[ derive( Clone , Debug , PartialEq , Eq ) ]
9
- struct EmptyMemo ;
8
+ pub struct EmptyMemo ;
10
9
#[ derive( Clone , Debug , PartialEq , Eq ) ]
11
- struct WithMemo ;
10
+ pub struct WithMemo {
11
+ memo : String ,
12
+ }
12
13
#[ derive( Clone , Debug , PartialEq , Eq ) ]
13
- struct WithSrcCallback ;
14
+ pub struct WithSrcCallback {
15
+ src_callback : IbcSrcCallback ,
16
+ }
14
17
#[ derive( Clone , Debug , PartialEq , Eq ) ]
15
- struct WithDstCallback ;
18
+ pub struct WithDstCallback {
19
+ dst_callback : IbcDstCallback ,
20
+ }
16
21
#[ derive( Clone , Debug , PartialEq , Eq ) ]
17
- struct WithCallbacks ;
22
+ pub struct WithCallbacks {
23
+ src_callback : IbcSrcCallback ,
24
+ dst_callback : IbcDstCallback ,
25
+ }
18
26
19
- // TODO: use trait for MemoData and get rid of state?
20
- #[ derive( Clone , Debug , PartialEq , Eq ) ]
21
- enum MemoData {
22
- Empty ,
23
- Text ( String ) ,
24
- IbcCallbacks ( IbcCallbackRequest ) ,
27
+ impl From < EmptyMemo > for Option < String > {
28
+ fn from ( _: EmptyMemo ) -> Self {
29
+ None
30
+ }
25
31
}
26
32
27
- impl From < MemoData > for Option < String > {
28
- fn from ( memo : MemoData ) -> Option < String > {
29
- match memo {
30
- MemoData :: Empty => None ,
31
- MemoData :: Text ( text) => Some ( text) ,
32
- MemoData :: IbcCallbacks ( callbacks) => Some ( to_json_string ( & callbacks) . unwrap ( ) ) ,
33
- }
33
+ impl From < WithMemo > for Option < String > {
34
+ fn from ( m : WithMemo ) -> Self {
35
+ Some ( m. memo )
36
+ }
37
+ }
38
+
39
+ impl From < WithSrcCallback > for Option < String > {
40
+ fn from ( s : WithSrcCallback ) -> Self {
41
+ Some ( to_json_string ( & IbcCallbackRequest :: source ( s. src_callback ) ) . unwrap ( ) )
42
+ }
43
+ }
44
+
45
+ impl From < WithDstCallback > for Option < String > {
46
+ fn from ( d : WithDstCallback ) -> Self {
47
+ Some ( to_json_string ( & IbcCallbackRequest :: destination ( d. dst_callback ) ) . unwrap ( ) )
48
+ }
49
+ }
50
+
51
+ impl From < WithCallbacks > for Option < String > {
52
+ fn from ( c : WithCallbacks ) -> Self {
53
+ Some ( to_json_string ( & IbcCallbackRequest :: both ( c. src_callback , c. dst_callback ) ) . unwrap ( ) )
34
54
}
35
55
}
36
56
37
- impl < T > TransferMsgBuilder < T > {
57
+ impl < T : Into < Option < String > > > TransferMsgBuilder < T > {
38
58
pub fn build ( self ) -> IbcMsg {
39
59
IbcMsg :: Transfer {
40
60
channel_id : self . channel_id ,
@@ -47,13 +67,12 @@ impl<T> TransferMsgBuilder<T> {
47
67
}
48
68
49
69
#[ derive( Clone , Debug , PartialEq , Eq ) ]
50
- pub struct TransferMsgBuilder < State > {
70
+ pub struct TransferMsgBuilder < MemoData > {
51
71
channel_id : String ,
52
72
to_address : String ,
53
73
amount : Coin ,
54
74
timeout : IbcTimeout ,
55
75
memo : MemoData ,
56
- _state : PhantomData < State > ,
57
76
}
58
77
59
78
impl TransferMsgBuilder < EmptyMemo > {
@@ -68,8 +87,7 @@ impl TransferMsgBuilder<EmptyMemo> {
68
87
to_address : to_address. into ( ) ,
69
88
amount,
70
89
timeout : timeout. into ( ) ,
71
- memo : MemoData :: Empty ,
72
- _state : PhantomData ,
90
+ memo : EmptyMemo ,
73
91
}
74
92
}
75
93
@@ -79,8 +97,7 @@ impl TransferMsgBuilder<EmptyMemo> {
79
97
to_address : self . to_address ,
80
98
amount : self . amount ,
81
99
timeout : self . timeout ,
82
- memo : MemoData :: Text ( memo. into ( ) ) ,
83
- _state : PhantomData ,
100
+ memo : WithMemo { memo : memo. into ( ) } ,
84
101
}
85
102
}
86
103
@@ -93,8 +110,7 @@ impl TransferMsgBuilder<EmptyMemo> {
93
110
to_address : self . to_address ,
94
111
amount : self . amount ,
95
112
timeout : self . timeout ,
96
- memo : MemoData :: IbcCallbacks ( IbcCallbackRequest :: source ( src_callback) ) ,
97
- _state : PhantomData ,
113
+ memo : WithSrcCallback { src_callback } ,
98
114
}
99
115
}
100
116
@@ -107,8 +123,7 @@ impl TransferMsgBuilder<EmptyMemo> {
107
123
to_address : self . to_address ,
108
124
amount : self . amount ,
109
125
timeout : self . timeout ,
110
- memo : MemoData :: IbcCallbacks ( IbcCallbackRequest :: destination ( dst_callback) ) ,
111
- _state : PhantomData ,
126
+ memo : WithDstCallback { dst_callback } ,
112
127
}
113
128
}
114
129
}
@@ -123,14 +138,10 @@ impl TransferMsgBuilder<WithSrcCallback> {
123
138
to_address : self . to_address ,
124
139
amount : self . amount ,
125
140
timeout : self . timeout ,
126
- memo : match self . memo {
127
- MemoData :: IbcCallbacks ( IbcCallbackRequest {
128
- src_callback : Some ( src_callback) ,
129
- ..
130
- } ) => MemoData :: IbcCallbacks ( IbcCallbackRequest :: both ( src_callback, dst_callback) ) ,
131
- _ => unreachable ! ( ) , // we know this never happens because of the WithSrcCallback state
141
+ memo : WithCallbacks {
142
+ src_callback : self . memo . src_callback ,
143
+ dst_callback,
132
144
} ,
133
- _state : PhantomData ,
134
145
}
135
146
}
136
147
}
@@ -145,14 +156,10 @@ impl TransferMsgBuilder<WithDstCallback> {
145
156
to_address : self . to_address ,
146
157
amount : self . amount ,
147
158
timeout : self . timeout ,
148
- memo : match self . memo {
149
- MemoData :: IbcCallbacks ( IbcCallbackRequest {
150
- dest_callback : Some ( dst_callback) ,
151
- ..
152
- } ) => MemoData :: IbcCallbacks ( IbcCallbackRequest :: both ( src_callback, dst_callback) ) ,
153
- _ => unreachable ! ( ) , // we know this never happens because of the WithDstCallback state
159
+ memo : WithCallbacks {
160
+ src_callback,
161
+ dst_callback : self . memo . dst_callback ,
154
162
} ,
155
- _state : PhantomData ,
156
163
}
157
164
}
158
165
}
0 commit comments