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
124
125
126
127
128
129
130
131
132
133
134
135
136
//! Modio provides a set of building blocks for interacting with the [mod.io](https://mod.io) API.
//!
//! The client uses asynchronous I/O, backed by the `futures` and `tokio` crates, and requires both
//! to be used alongside.
//!
//! # Authentication
//!
//! To access the API authentication is required and can be done via several ways:
//!
//! - Request an [API key (Read-only)](https://mod.io/me/access)
//! - Manually create an [OAuth 2 Access Token (Read + Write)](https://mod.io/me/access#oauth)
//! - [Email Authentication Flow](Client::request_token) to create an OAuth 2 Access Token
//! (Read + Write)
//! - [External Authentication](Client::external_auth) to create an OAuth 2 Access Token (Read + Write)
//! automatically on platforms such as Steam, GOG, itch.io, Switch, Xbox, Discord and Oculus.
//!
//! # Rate Limiting
//!
//! - API keys linked to a game have **unlimited requests**.
//! - API keys linked to a user have **60 requests per minute**.
//! - OAuth2 user tokens are limited to **120 requests per minute**.
//!
//! [`Error::is_ratelimited`] will return true
//! if the rate limit associated with credentials has been exhausted.
//!
//! # Example: Basic setup
//!
//! ```no_run
//! use modio::Client;
//!
//! #[tokio::main]
//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
//! let modio = Client::builder(std::env::var("MODIO_API_KEY")?).build()?;
//!
//! // create some tasks and execute them
//! // let result = task.await?;
//! Ok(())
//! }
//! ```
//!
//! For testing purposes use [`Builder::host`] to create a client for the
//! mod.io [test environment](https://docs.mod.io/restapiref/#testing).
//!
//! [`Builder::host`]: crate::client::Builder::host
//!
//! # Example: Chaining api requests
//!
//! ```no_run
//! # #[tokio::main]
//! # async fn main() -> Result<(), Box<dyn std::error::Error>> {
//! # let modio = modio::Client::builder(std::env::var("MODIO_API_KEY")?).build()?;
//! use modio::types::id::Id;
//!
//! // OpenXcom: The X-Com Files
//! let (game_id, mod_id) = (Id::new(51), Id::new(158));
//! let resp = modio.get_mod(game_id, mod_id).await?;
//! let mod_ = resp.data().await?;
//!
//! // Get mod with its dependencies and all files
//! let resp = modio.get_mod_dependencies(game_id, mod_id).await?;
//! let deps = resp.data().await?;
//!
//! let resp = modio.get_files(game_id, mod_id).await?;
//! let files = resp.data().await?;
//!
//! println!("{}", mod_.name);
//! println!(
//! "deps: {:?}",
//! deps.data.into_iter().map(|d| d.mod_id).collect::<Vec<_>>()
//! );
//! for file in files.data {
//! println!("file id: {} version: {:?}", file.id, file.version);
//! }
//! # Ok(())
//! # }
//! ```
//!
//! # Example: Downloading mods
//!
//! ```no_run
//! # #[tokio::main]
//! # async fn main() -> Result<(), Box<dyn std::error::Error>> {
//! # let modio = modio::Client::builder(std::env::var("MODIO_API_KEY")?).build()?;
//! use modio::types::id::Id;
//! use modio::util::download::{Download, DownloadAction, ResolvePolicy};
//!
//! // Download the primary file of a mod.
//! let action = DownloadAction::Primary {
//! game_id: Id::new(5),
//! mod_id: Id::new(19),
//! };
//! modio.download(action).save_to_file("mod.zip").await?;
//!
//! // Download the specific file of a mod.
//! let action = DownloadAction::File {
//! game_id: Id::new(5),
//! mod_id: Id::new(19),
//! file_id: Id::new(101),
//! };
//! modio.download(action).save_to_file("mod.zip").await?;
//!
//! // Download the specific version of a mod.
//! // if multiple files are found then the latest file is downloaded.
//! // Set policy to `ResolvePolicy::Fail` to return with
//! // `modio::download::Error::MultipleFilesFound` as source error.
//! let action = DownloadAction::Version {
//! game_id: Id::new(5),
//! mod_id: Id::new(19),
//! version: "0.1".to_string(),
//! policy: ResolvePolicy::Latest,
//! };
//! modio.download(action).save_to_file("mod.zip").await?;
//! # Ok(())
//! # }
//! ```
pub use crateClient;
pub use crate;