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
//! API client for [crates.io](https://crates.io). //! //! It aims to provide an easy to use and complete client for retrieving //! information about Rust's crate ecosystem. //! //! **Note:** Right now, only a synchronous client is available. //! Once the Async version of hyper stabilizes, an asynchronous client based //! on Tokio will be added. //! //! # Examples //! //! Print the most downloaded crates and their non-optional dependencies: //! //! ``` //! use crates_io_api::{SyncClient, Error}; //! //! fn list_top_dependencies() -> Result<(), Error> { //! // Instantiate the client. //! let client = SyncClient::new(); //! // Retrieve summary data. //! let summary = client.summary()?; //! for c in summary.most_downloaded { //! println!("{}:", c.id); //! for dep in client.crate_dependencies(&c.id, &c.max_version)? { //! // Ignore optional dependencies. //! if !dep.optional { //! println!(" * {} - {}", dep.id, dep.version_id); //! } //! } //! } //! Ok(()) //! } //! ``` #[macro_use] extern crate failure; extern crate serde; #[macro_use] extern crate serde_derive; extern crate chrono; extern crate reqwest; extern crate serde_json; #[macro_use] extern crate log; extern crate futures; extern crate tokio_core; extern crate url; mod async; mod sync; mod types; pub use async::Client as AsyncClient; pub use sync::SyncClient; pub use types::*; #[derive(Fail, Debug)] pub enum Error { #[fail(display = "{}", _0)] Http(reqwest::Error), #[fail(display = "{}", _0)] Url(url::ParseError), #[fail(display = "Not found")] NotFound, } impl From<reqwest::Error> for Error { fn from(e: reqwest::Error) -> Self { Error::Http(e) } } impl From<url::ParseError> for Error { fn from(e: url::ParseError) -> Self { Error::Url(e) } }