Skip to content

Commit 9e86d2d

Browse files
committed
Refactor TransferMsgBuilder
1 parent b2350b1 commit 9e86d2d

File tree

1 file changed

+53
-46
lines changed

1 file changed

+53
-46
lines changed

packages/std/src/ibc/transfer_msg_builder.rs

Lines changed: 53 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,60 @@
1-
use std::marker::PhantomData;
2-
31
use crate::{
42
to_json_string, Coin, IbcCallbackRequest, IbcDstCallback, IbcMsg, IbcSrcCallback, IbcTimeout,
53
};
64

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
87
#[derive(Clone, Debug, PartialEq, Eq)]
9-
struct EmptyMemo;
8+
pub struct EmptyMemo;
109
#[derive(Clone, Debug, PartialEq, Eq)]
11-
struct WithMemo;
10+
pub struct WithMemo {
11+
memo: String,
12+
}
1213
#[derive(Clone, Debug, PartialEq, Eq)]
13-
struct WithSrcCallback;
14+
pub struct WithSrcCallback {
15+
src_callback: IbcSrcCallback,
16+
}
1417
#[derive(Clone, Debug, PartialEq, Eq)]
15-
struct WithDstCallback;
18+
pub struct WithDstCallback {
19+
dst_callback: IbcDstCallback,
20+
}
1621
#[derive(Clone, Debug, PartialEq, Eq)]
17-
struct WithCallbacks;
22+
pub struct WithCallbacks {
23+
src_callback: IbcSrcCallback,
24+
dst_callback: IbcDstCallback,
25+
}
1826

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+
}
2531
}
2632

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())
3454
}
3555
}
3656

37-
impl<T> TransferMsgBuilder<T> {
57+
impl<T: Into<Option<String>>> TransferMsgBuilder<T> {
3858
pub fn build(self) -> IbcMsg {
3959
IbcMsg::Transfer {
4060
channel_id: self.channel_id,
@@ -47,13 +67,12 @@ impl<T> TransferMsgBuilder<T> {
4767
}
4868

4969
#[derive(Clone, Debug, PartialEq, Eq)]
50-
pub struct TransferMsgBuilder<State> {
70+
pub struct TransferMsgBuilder<MemoData> {
5171
channel_id: String,
5272
to_address: String,
5373
amount: Coin,
5474
timeout: IbcTimeout,
5575
memo: MemoData,
56-
_state: PhantomData<State>,
5776
}
5877

5978
impl TransferMsgBuilder<EmptyMemo> {
@@ -68,8 +87,7 @@ impl TransferMsgBuilder<EmptyMemo> {
6887
to_address: to_address.into(),
6988
amount,
7089
timeout: timeout.into(),
71-
memo: MemoData::Empty,
72-
_state: PhantomData,
90+
memo: EmptyMemo,
7391
}
7492
}
7593

@@ -79,8 +97,7 @@ impl TransferMsgBuilder<EmptyMemo> {
7997
to_address: self.to_address,
8098
amount: self.amount,
8199
timeout: self.timeout,
82-
memo: MemoData::Text(memo.into()),
83-
_state: PhantomData,
100+
memo: WithMemo { memo: memo.into() },
84101
}
85102
}
86103

@@ -93,8 +110,7 @@ impl TransferMsgBuilder<EmptyMemo> {
93110
to_address: self.to_address,
94111
amount: self.amount,
95112
timeout: self.timeout,
96-
memo: MemoData::IbcCallbacks(IbcCallbackRequest::source(src_callback)),
97-
_state: PhantomData,
113+
memo: WithSrcCallback { src_callback },
98114
}
99115
}
100116

@@ -107,8 +123,7 @@ impl TransferMsgBuilder<EmptyMemo> {
107123
to_address: self.to_address,
108124
amount: self.amount,
109125
timeout: self.timeout,
110-
memo: MemoData::IbcCallbacks(IbcCallbackRequest::destination(dst_callback)),
111-
_state: PhantomData,
126+
memo: WithDstCallback { dst_callback },
112127
}
113128
}
114129
}
@@ -123,14 +138,10 @@ impl TransferMsgBuilder<WithSrcCallback> {
123138
to_address: self.to_address,
124139
amount: self.amount,
125140
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,
132144
},
133-
_state: PhantomData,
134145
}
135146
}
136147
}
@@ -145,14 +156,10 @@ impl TransferMsgBuilder<WithDstCallback> {
145156
to_address: self.to_address,
146157
amount: self.amount,
147158
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,
154162
},
155-
_state: PhantomData,
156163
}
157164
}
158165
}

0 commit comments

Comments
 (0)