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";