1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
//! Coinbase pro client with sync/async + websocket-feed support
//!
//! ## Structure
//!
//! There are two main structures to work with: [`Private`] and [`Public`], which provide interfaces to
//! work with [https://docs.pro.coinbase.com](https://docs.pro.coinbase.com) .
//! The structures should be parametrised with: [`Sync`] or [`ASync`] adapter-type, which blocks
//! future and returns result of its execution for Sync adapter or returns Future for ASync
//! adapter.
//!
//! [`WSFeed`] provides futures::Stream of websocket message for different channels.
//!
//! ## Examples
//!
//! ### Async
//! ```
//! extern crate hyper;
//! extern crate tokio;
//! extern crate coinbase_pro_rs;
//!
//! use hyper::rt::Future;
//! use coinbase_pro_rs::{Public, ASync, SANDBOX_URL};
//!
//! fn main() {
//!     let client: Public<ASync> = Public::new_with_keep_alive(SANDBOX_URL, false);
//!     // if keep_alive is not disables - tokio::run will hold the connection without exiting the example
//!     let f = client.get_time()
//!         .map_err(|_| ())
//!         .and_then(|time| {
//!             println!("Coinbase.time: {}", time.iso);
//!             Ok(())
//!         });
//!
//!     tokio::run(f);
//! }
//! ```
//! ### Sync
//! ```
//! extern crate coinbase_pro_rs;
//!
//! use coinbase_pro_rs::{Public, Sync, SANDBOX_URL};
//!
//! fn main() {
//!    let client: Public<Sync> = Public::new(SANDBOX_URL);
//!    let time = client.get_time().unwrap();
//!    println!("Coinbase.time: {}", time.iso);
//!}
//! ```
//! ### Websocket
//! ```
//! extern crate futures;
//! extern crate tokio;
//! extern crate coinbase_pro_rs;
//!
//! use futures::{Future, Stream};
//! use coinbase_pro_rs::{WSFeed, WS_SANDBOX_URL};
//! use coinbase_pro_rs::structs::wsfeed::*;
//!
//! fn main() {
//!     let stream = WSFeed::new(WS_SANDBOX_URL,
//!         &["BTC-USD"], &[ChannelType::Heartbeat]);
//!
//!     let f = stream
//!         .take(10)
//!         .for_each(|msg| {
//!         match msg {
//!             Message::Heartbeat {sequence, last_trade_id, time, ..} => println!("{}: seq:{} id{}",
//!                                                                                time, sequence, last_trade_id),
//!             Message::Error {message} => println!("Error: {}", message),
//!             Message::InternalError(_) => panic!("internal_error"),
//!             other => println!("{:?}", other)
//!         }
//!         Ok(())
//!     });
//!
//!     tokio::run(f.map_err(|_| panic!("stream fail")));
//! }
//! ```

#[macro_use]
extern crate serde_derive;
#[macro_use]
extern crate failure;
#[macro_use]
extern crate log;
extern crate chrono;
extern crate futures;
extern crate hyper;
extern crate hyper_tls;
extern crate pretty_env_logger;
extern crate serde;
extern crate serde_json;
extern crate time;
extern crate tokio;
extern crate tokio_tungstenite;
extern crate uuid;

pub mod adapters;
pub mod error;
pub mod private;
pub mod public;
pub mod structs;
mod utils;

pub mod wsfeed;

pub use adapters::{ASync, Sync};
pub use error::CBError;
pub use error::WSError;
pub use private::Private;
pub use public::Public;
pub use wsfeed::WSFeed;

pub type Result<T> = std::result::Result<T, CBError>;

/// https://api.pro.coinbase.com
pub const MAIN_URL: &str = "https://api.pro.coinbase.com";
/// https://api-public.sandbox.pro.coinbase.com
pub const SANDBOX_URL: &str = "https://api-public.sandbox.pro.coinbase.com";
/// wss://ws-feed.pro.coinbase.com
pub const WS_URL: &str = "wss://ws-feed.pro.coinbase.com";
/// wss://ws-feed-public.sandbox.pro.coinbase.com
pub const WS_SANDBOX_URL: &str = "wss://ws-feed-public.sandbox.pro.coinbase.com";