zaif-api 0.6.0

Zaif API Wrapper
use serde_json;

use self::serde_json::Value;
use std::collections::HashMap;

use crate::core::*;

pub use self::active_orders::*;
pub use self::cancel_order::*;
pub use self::get_id_info::*;
pub use self::get_info2::*;
pub use self::get_personal_info::*;
pub use self::trade::*;
pub use self::trade_history::*;

mod active_orders;
mod cancel_order;
mod get_id_info;
mod get_info2;
mod get_personal_info;
mod trade;
mod trade_history;

trait TradeApi {
    fn method(&self) -> &str;
    fn parameters(&self) -> HashMap<String, String>;
    fn access_key(&self) -> &AccessKey;

    fn exec(&self) -> crate::Result<Value> {
        let mut param = self.parameters().clone();
        param.insert("method".to_string(), self.method().to_string());

        let api = ApiBuilder::new()
            .access_key(self.access_key().clone())
            .uri("https://api.zaif.jp/tapi")
            .method(Method::Post)
            .param(param)
            .finalize();

        let res = api.exec()?;
        let result: Value = serde_json::from_str(res.as_str())?;
        if result["success"].as_i64() != Some(1) {
            return Err(format!("error: {}", result["error"]).into());
        }
        Ok(result["return"].clone())
    }
}