Skip to content

Commit 8458b0b

Browse files
authored
Merge pull request #30 from yajamon/response_struct_for_trade
Response struct for trade Fix #19
2 parents cd632d6 + 1f20d13 commit 8458b0b

File tree

6 files changed

+174
-67
lines changed

6 files changed

+174
-67
lines changed

src/main.rs

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ fn main() {
4242
let api = GetInfo2Builder::new()
4343
.access_key(access_key.clone())
4444
.finalize();
45-
println!("{}", api.exec().unwrap());
45+
for (coin, amount) in api.exec().unwrap().funds.iter() {
46+
println!("coin: {} amount: {}", coin, amount);
47+
}
4648

4749
let api = TradeBuilder::new()
4850
.access_key(access_key.clone())
@@ -51,26 +53,50 @@ fn main() {
5153
.price(1.0)
5254
.amount(0.1)
5355
.finalize();
54-
match api.exec() {
55-
Ok(res) => {
56-
println!("{}", res);
57-
let json: Value = serde_json::from_str(res.as_str()).unwrap();
58-
let order_id = json["return"]["order_id"].as_u64().unwrap();
56+
match api.exec()
57+
.and_then(|res| {
58+
println!(
59+
"received: {}, remains: {}, order_id: {}",
60+
res.received,
61+
res.remains,
62+
res.order_id
63+
);
64+
if res.order_id == 0 {
65+
panic!("Complete trade.");
66+
}
67+
Ok(res.order_id)
68+
})
69+
.and_then(|order_id| {
5970
let api = CancelOrderBuilder::new()
6071
.access_key(access_key.clone())
6172
.order_id(order_id)
6273
.currency_pair(Some("zaif_jpy".to_string()))
6374
.finalize();
6475
let wait_time = time::Duration::from_secs(5);
6576
thread::sleep(wait_time);
66-
println!("{}", api.exec().unwrap());
67-
}
68-
_ => return,
77+
api.exec()
78+
})
79+
.and_then(|res| {
80+
println!("Cancel order_id: {}", res.order_id);
81+
Ok(())
82+
}) {
83+
84+
Ok(_) => println!("Complete trade and cancel"),
85+
Err(e) => println!("Error: {}", e),
6986
}
7087

7188
let api = ActiveOrdersBuilder::new()
7289
.access_key(access_key.clone())
7390
.currency_pair(Some("zaif_jpy".to_string()))
7491
.finalize();
75-
println!("{}", api.exec().unwrap());
92+
for (order_id, order) in api.exec().unwrap().iter() {
93+
println!(
94+
"order_id: {}, currency_pair: {}, action: {}, amount: {}, price: {}",
95+
order_id,
96+
order.currency_pair,
97+
order.action,
98+
order.amount,
99+
order.price
100+
);
101+
}
76102
}

src/trade_api/active_orders.rs

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,47 @@
1-
extern crate reqwest;
1+
extern crate serde;
2+
extern crate serde_json;
23

34
use std::collections::HashMap;
45

5-
use core::*;
6+
use trade_api::TradeApi;
7+
use core::AccessKey;
68

79
builder!(ActiveOrdersBuilder => ActiveOrders {
810
access_key: AccessKey = AccessKey::new("", ""),
911
currency_pair: Option<String> = None
1012
});
1113

1214
impl ActiveOrders {
13-
pub fn exec(&self) -> reqwest::Result<String> {
14-
let param: &mut HashMap<String, String> = &mut HashMap::new();
15-
param.insert("method".to_string(), "active_orders".to_string());
15+
pub fn exec(&self) -> serde_json::Result<HashMap<u64, ActiveOrdersResponse>> {
16+
serde_json::from_value(<Self as TradeApi>::exec(&self)?)
17+
}
18+
}
19+
20+
impl TradeApi for ActiveOrders {
21+
fn method(&self) -> &str {
22+
"active_orders"
23+
}
24+
fn parameters(&self) -> HashMap<String, String> {
25+
let mut param = HashMap::new();
1626
if let Some(ref currency_pair) = self.currency_pair {
1727
param.insert(
1828
"currency_pair".to_string(),
1929
format!("{}", currency_pair.clone()),
2030
);
2131
}
22-
23-
let api = ApiBuilder::new()
24-
.access_key(self.access_key.clone())
25-
.uri("https://api.zaif.jp/tapi")
26-
.method(Method::Post)
27-
.param(param.clone())
28-
.finalize();
29-
30-
api.exec()
32+
param
33+
}
34+
fn access_key(&self) -> &AccessKey {
35+
&self.access_key
3136
}
3237
}
3338

39+
#[derive(Deserialize)]
40+
pub struct ActiveOrdersResponse {
41+
pub currency_pair: String,
42+
pub action: String,
43+
pub amount: f64,
44+
pub price: f64,
45+
pub timestamp: String,
46+
pub comment: String,
47+
}

src/trade_api/cancel_order.rs

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
extern crate reqwest;
1+
extern crate serde;
2+
extern crate serde_json;
23

34
use std::collections::HashMap;
45

5-
use core::*;
6+
use trade_api::TradeApi;
7+
use core::AccessKey;
68

79
builder!(CancelOrderBuilder => CancelOrder {
810
access_key: AccessKey = AccessKey::new("", ""),
@@ -11,25 +13,33 @@ builder!(CancelOrderBuilder => CancelOrder {
1113
});
1214

1315
impl CancelOrder {
14-
pub fn exec(&self) -> reqwest::Result<String> {
15-
let param: &mut HashMap<String, String> = &mut HashMap::new();
16-
param.insert("method".to_string(), "cancel_order".to_string());
16+
pub fn exec(&self) -> serde_json::Result<CancelOrderResponse> {
17+
serde_json::from_value(<Self as TradeApi>::exec(&self)?)
18+
}
19+
}
20+
21+
impl TradeApi for CancelOrder {
22+
fn method(&self) -> &str {
23+
"cancel_order"
24+
}
25+
fn parameters(&self) -> HashMap<String, String> {
26+
let mut param = HashMap::new();
1727
param.insert("order_id".to_string(), format!("{}", self.order_id));
1828
if let Some(ref currency_pair) = self.currency_pair {
1929
param.insert(
2030
"currency_pair".to_string(),
2131
format!("{}", currency_pair.clone()),
2232
);
2333
}
24-
25-
let api = ApiBuilder::new()
26-
.access_key(self.access_key.clone())
27-
.uri("https://api.zaif.jp/tapi")
28-
.method(Method::Post)
29-
.param(param.clone())
30-
.finalize();
31-
32-
api.exec()
34+
param
35+
}
36+
fn access_key(&self) -> &AccessKey {
37+
&self.access_key
3338
}
3439
}
3540

41+
#[derive(Deserialize)]
42+
pub struct CancelOrderResponse {
43+
pub order_id: u64,
44+
pub funds: HashMap<String, f64>,
45+
}

src/trade_api/get_info2.rs

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,38 @@
1-
extern crate reqwest;
1+
extern crate serde;
2+
extern crate serde_json;
23

34
use std::collections::HashMap;
45

5-
use core::*;
6+
use trade_api::TradeApi;
7+
use core::AccessKey;
68

79
builder!(GetInfo2Builder => GetInfo2 {
810
access_key: AccessKey = AccessKey::new("", "")
911
});
1012

1113
impl GetInfo2 {
12-
pub fn new(access_key: AccessKey) -> GetInfo2 {
13-
GetInfo2 { access_key: access_key }
14+
pub fn exec(&self) -> serde_json::Result<GetInfo2Response> {
15+
serde_json::from_value(<Self as TradeApi>::exec(&self)?)
1416
}
15-
pub fn exec(&self) -> reqwest::Result<String> {
16-
let param: &mut HashMap<String, String> = &mut HashMap::new();
17-
param.insert("method".to_string(), "get_info2".to_string());
18-
19-
let api = ApiBuilder::new()
20-
.access_key(self.access_key.clone())
21-
.uri("https://api.zaif.jp/tapi")
22-
.method(Method::Post)
23-
.param(param.clone())
24-
.finalize();
17+
}
2518

26-
api.exec()
19+
impl TradeApi for GetInfo2 {
20+
fn method(&self) -> &str {
21+
"get_info2"
22+
}
23+
fn parameters(&self) -> HashMap<String, String> {
24+
HashMap::new()
25+
}
26+
fn access_key(&self) -> &AccessKey {
27+
&self.access_key
2728
}
2829
}
2930

31+
#[derive(Deserialize)]
32+
pub struct GetInfo2Response {
33+
pub funds: HashMap<String, f64>,
34+
pub deposit: HashMap<String, f64>,
35+
pub rights: HashMap<String, i64>,
36+
pub open_orders: i64,
37+
pub server_time: i64,
38+
}

src/trade_api/mod.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
extern crate reqwest;
2+
extern crate serde_json;
3+
4+
use std::collections::HashMap;
5+
use self::serde_json::Value;
6+
7+
use core::*;
8+
19
pub use self::get_info2::*;
210
pub use self::trade::*;
311
pub use self::active_orders::*;
@@ -7,3 +15,31 @@ mod get_info2;
715
mod trade;
816
mod active_orders;
917
mod cancel_order;
18+
19+
trait TradeApi {
20+
fn method(&self) -> &str;
21+
fn parameters(&self) -> HashMap<String, String>;
22+
fn access_key(&self) -> &AccessKey;
23+
24+
fn exec(&self) -> serde_json::Result<Value> {
25+
let mut param = self.parameters().clone();
26+
param.insert("method".to_string(), self.method().to_string());
27+
28+
let api = ApiBuilder::new()
29+
.access_key(self.access_key().clone())
30+
.uri("https://api.zaif.jp/tapi")
31+
.method(Method::Post)
32+
.param(param)
33+
.finalize();
34+
35+
let res = match api.exec() {
36+
Ok(res) => res,
37+
Err(e) => panic!("reqwest Error: {}", e),
38+
};
39+
let result: Value = serde_json::from_str(res.as_str())?;
40+
if result["success"].as_i64().unwrap() != 1 {
41+
panic!("error: {}", result["error"]);
42+
}
43+
Ok(result["return"].clone())
44+
}
45+
}

src/trade_api/trade.rs

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
extern crate reqwest;
1+
extern crate serde;
2+
extern crate serde_json;
23

34
use std::collections::HashMap;
45

5-
use core::*;
6+
use trade_api::TradeApi;
7+
use core::AccessKey;
68

79
#[derive(Copy, Clone)]
810
pub enum TradeAction {
@@ -31,9 +33,17 @@ builder!(TradeBuilder => Trade {
3133
});
3234

3335
impl Trade {
34-
pub fn exec(&self) -> reqwest::Result<String> {
35-
let param: &mut HashMap<String, String> = &mut HashMap::new();
36-
param.insert("method".to_string(), "trade".to_string());
36+
pub fn exec(&self) -> serde_json::Result<TradeResponse> {
37+
serde_json::from_value(<Self as TradeApi>::exec(&self)?)
38+
}
39+
}
40+
41+
impl TradeApi for Trade {
42+
fn method(&self) -> &str {
43+
"trade"
44+
}
45+
fn parameters(&self) -> HashMap<String, String> {
46+
let mut param = HashMap::new();
3747
param.insert("currency_pair".to_string(), self.currency_pair.clone());
3848
param.insert("action".to_string(), self.action.param_string());
3949
param.insert("price".to_string(), format!("{}", self.price));
@@ -44,15 +54,17 @@ impl Trade {
4454
if let Some(ref comment) = self.comment {
4555
param.insert("comment".to_string(), format!("{}", comment.clone()));
4656
}
47-
48-
let api = ApiBuilder::new()
49-
.access_key(self.access_key.clone())
50-
.uri("https://api.zaif.jp/tapi")
51-
.method(Method::Post)
52-
.param(param.clone())
53-
.finalize();
54-
55-
api.exec()
57+
param
58+
}
59+
fn access_key(&self) -> &AccessKey {
60+
&self.access_key
5661
}
5762
}
5863

64+
#[derive(Deserialize)]
65+
pub struct TradeResponse {
66+
pub received: f64,
67+
pub remains: f64,
68+
pub order_id: u64,
69+
pub funds: HashMap<String, f64>,
70+
}

0 commit comments

Comments
 (0)