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