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 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
mod account;
mod at_home;
mod auth;
mod author;
mod captcha;
mod chapter;
mod cover;
pub(crate) mod custom_list;
mod feed;
mod infrastructure;
mod legacy;
mod manga;
mod rating;
pub(crate) mod report;
mod scanlation_group;
mod search;
mod settings;
mod statistics;
mod upload;
pub(crate) mod user;
#[cfg(not(feature = "multi-thread"))]
use std::cell::RefCell;
#[cfg(not(feature = "multi-thread"))]
use std::rc::Rc;
#[cfg(feature = "multi-thread")]
use std::sync::Arc;
#[cfg(feature = "multi-thread")]
use futures::lock::Mutex;
pub use mangadex_api_schema::v5 as schema;
pub(crate) use mangadex_api_schema::v5::AuthTokens;
use reqwest::Client;
use crate::v5::account::AccountBuilder;
use crate::v5::at_home::AtHomeBuilder;
use crate::v5::auth::AuthBuilder;
use crate::v5::author::AuthorBuilder;
use crate::v5::captcha::CaptchaBuilder;
use crate::v5::chapter::ChapterBuilder;
use crate::v5::cover::CoverBuilder;
use crate::v5::custom_list::CustomListBuilder;
use crate::v5::feed::FeedBuilder;
use crate::v5::infrastructure::InfrastructureBuilder;
use crate::v5::legacy::LegacyBuilder;
use crate::v5::manga::MangaBuilder;
use crate::v5::rating::RatingBuilder;
use crate::v5::report::ReportBuilder;
use crate::v5::scanlation_group::ScanlationGroupBuilder;
use crate::v5::search::SearchBuilder;
use crate::v5::settings::SettingsBuilder;
use crate::v5::statistics::StatisticsBuilder;
use crate::v5::upload::UploadBuilder;
use crate::v5::user::UserBuilder;
use crate::HttpClient;
use crate::HttpClientRef;
/// API client to make requests to the MangaDex v5 API.
#[derive(Clone, Debug)]
pub struct MangaDexClient {
pub(crate) http_client: HttpClientRef,
}
impl Default for MangaDexClient {
/// Create a new `MangaDexClient` with the default [`reqwest::Client`](https://docs.rs/reqwest/latest/reqwest/struct.Client.html) settings.
///
/// # Examples
///
/// ```rust
/// use reqwest::Client;
///
/// use mangadex_api::v5::MangaDexClient;
///
/// # async fn run() -> Result<(), reqwest::Error> {
/// let client = MangaDexClient::default();
/// # Ok(())
/// # }
/// ```
fn default() -> Self {
Self {
http_client: create_ref_counted_http_client(HttpClient::default()),
}
}
}
impl MangaDexClient {
/// Create a new `MangaDexClient` with a custom [`reqwest::Client`](https://docs.rs/reqwest/latest/reqwest/struct.Client.html).
///
/// # Examples
///
/// ```rust
/// use reqwest::Client;
///
/// use mangadex_api::v5::MangaDexClient;
///
/// # async fn run() -> Result<(), reqwest::Error> {
/// let reqwest_client = Client::builder()
/// .timeout(std::time::Duration::from_secs(10))
/// .build()?;
///
/// let client = MangaDexClient::new(reqwest_client);
/// # Ok(())
/// # }
/// ```
pub fn new(client: Client) -> Self {
Self {
http_client: create_ref_counted_http_client(HttpClient::new(client)),
}
}
/// Create a new `MangaDexClient` with a custom [`HttpClient`](crate::HttpClient).
///
/// In most cases, providing a custom [`HttpClient`](crate::HttpClient) isn't necessary.
/// This function is primarily useful for mock testing but is available for anyone that needs to
/// change the base URL if it changes due to an unforeseen event.
///
/// # Examples
///
/// ```rust
/// use reqwest::Client;
/// use url::Url;
///
/// use mangadex_api::v5::MangaDexClient;
/// use mangadex_api::HttpClient;
///
/// # async fn run() -> anyhow::Result<()> {
/// let reqwest_client = Client::builder()
/// .timeout(std::time::Duration::from_secs(10))
/// .build()?;
///
/// let http_client = HttpClient::builder()
/// .client(reqwest_client)
/// .base_url(Url::parse("127.0.0.1:8080")?)
/// .build()?;
///
/// let client = MangaDexClient::new_with_http_client(http_client);
/// # Ok(())
/// # }
/// ```
pub fn new_with_http_client(http_client: HttpClient) -> Self {
Self {
http_client: create_ref_counted_http_client(http_client),
}
}
/// Return the Reqwest `Client`.
///
/// This can be used to create manual HTTP requests.
///
/// Using this is generally not advised as it can provide mutable access to the [`HttpClient`](crate::HttpClient).
pub fn get_http_client(&self) -> HttpClientRef {
self.http_client.clone()
}
/// Get a builder for handling the account endpoints.
///
/// <https://api.mangadex.org/swagger.html#/Account>
pub fn account(&self) -> AccountBuilder {
AccountBuilder::new(self.http_client.clone())
}
/// Get a builder for handling the At-Home endpoints.
///
/// <https://api.mangadex.org/swagger.html#/AtHome>
pub fn at_home(&self) -> AtHomeBuilder {
AtHomeBuilder::new(self.http_client.clone())
}
/// Get a builder for handling the authentication endpoints.
///
/// <https://api.mangadex.org/swagger.html#/Auth>
pub fn auth(&self) -> AuthBuilder {
AuthBuilder::new(self.http_client.clone())
}
/// Get a builder for handling the author endpoints.
///
/// <https://api.mangadex.org/swagger.html#/Author>
pub fn author(&self) -> AuthorBuilder {
AuthorBuilder::new(self.http_client.clone())
}
/// Get a builder for handling the captcha endpoints.
///
/// <https://api.mangadex.org/swagger.html#/Captcha>
pub fn captcha(&self) -> CaptchaBuilder {
CaptchaBuilder::new(self.http_client.clone())
}
/// Get a builder for handling the chapter endpoints.
///
/// <https://api.mangadex.org/swagger.html#/Chapter>
pub fn chapter(&self) -> ChapterBuilder {
ChapterBuilder::new(self.http_client.clone())
}
/// Get a builder for handling manga volume cover art endpoints.
///
/// <https://api.mangadex.org/swagger.html#/Cover>
pub fn cover(&self) -> CoverBuilder {
CoverBuilder::new(self.http_client.clone())
}
/// Get a builder for handling the custom list endpoints.
///
/// <https://api.mangadex.org/swagger.html#/CustomList>
pub fn custom_list(&self) -> CustomListBuilder {
CustomListBuilder::new(self.http_client.clone())
}
/// Get a builder for handling the feed endpoints.
///
/// <https://api.mangadex.org/swagger.html#/Feed>
pub fn feed(&self) -> FeedBuilder {
FeedBuilder::new(self.http_client.clone())
}
/// Get a builder for handling the infrastructure endpoints.
///
/// <https://api.mangadex.org/swagger.html#/Infrastructure>
pub fn infrastructure(&self) -> InfrastructureBuilder {
InfrastructureBuilder::new(self.http_client.clone())
}
/// Get a builder for handling the legacy endpoints.
///
/// <https://api.mangadex.org/swagger.html#/Legacy>
pub fn legacy(&self) -> LegacyBuilder {
LegacyBuilder::new(self.http_client.clone())
}
/// Get a builder for handling the manga endpoints.
///
/// <https://api.mangadex.org/swagger.html#/Manga>
pub fn manga(&self) -> MangaBuilder {
MangaBuilder::new(self.http_client.clone())
}
/// Get a builder for handling the rating endpoints.
///
/// <https://api.mangadex.org/swagger.html#/Rating>
pub fn rating(&self) -> RatingBuilder {
RatingBuilder::new(self.http_client.clone())
}
/// Get a builder for handling the report endpoints.
///
/// <https://api.mangadex.org/swagger.html#/Report>
pub fn report(&self) -> ReportBuilder {
ReportBuilder::new(self.http_client.clone())
}
/// Get a builder for handling the scanlation group endpoints.
///
/// <https://api.mangadex.org/swagger.html#/ScanlationGroup>
pub fn scanlation_group(&self) -> ScanlationGroupBuilder {
ScanlationGroupBuilder::new(self.http_client.clone())
}
/// Get a builder for handling the search endpoints.
///
/// This is a convenience builder that aggregates search endpoints from various categories.
pub fn search(&self) -> SearchBuilder {
SearchBuilder::new(self.http_client.clone())
}
/// Get a builder for handling the settings endpoints.
///
/// <https://api.mangadex.org/swagger.html#/Settings>
// Not public yet as the settings endpoints are not stable as of MangaDex API v5.4.9.
#[allow(unused)]
fn settings(&self) -> SettingsBuilder {
SettingsBuilder::new(self.http_client.clone())
}
/// Get a builder for handling the statistics endpoints.
///
/// <https://api.mangadex.org/swagger.html#/Statistics>
pub fn statistics(&self) -> StatisticsBuilder {
StatisticsBuilder::new(self.http_client.clone())
}
/// Get a builder for handling uploads.
///
/// <https://api.mangadex.org/swagger.html#/Upload>
pub fn upload(&self) -> UploadBuilder {
UploadBuilder::new(self.http_client.clone())
}
/// Get a builder for handling the user endpoints.
///
/// <https://api.mangadex.org/swagger.html#/User>
pub fn user(&self) -> UserBuilder {
UserBuilder::new(self.http_client.clone())
}
}
/// Create a new reference counted `HttpClient`.
fn create_ref_counted_http_client(http_client: HttpClient) -> HttpClientRef {
#[cfg(not(feature = "multi-thread"))]
{
Rc::new(RefCell::new(http_client))
}
#[cfg(feature = "multi-thread")]
{
Arc::new(Mutex::new(http_client))
}
}