1pub mod account;
2pub mod analysis;
3pub mod arena_tournaments;
4pub mod board;
5pub mod bot;
6pub mod broadcasts;
7pub mod bulk_pairings;
8pub mod challenges;
9pub mod external_engine;
10pub mod fide;
11pub mod games;
12pub mod messaging;
13#[cfg(feature = "oauth")]
14pub mod oauth;
15pub mod openings;
16pub mod puzzles;
17pub mod relations;
18pub mod simuls;
19pub mod studies;
20pub mod swiss_tournaments;
21pub mod tablebase;
22pub mod teams;
23pub mod tv;
24pub mod users;
25
26use futures::stream::StreamExt;
27
28use crate::client::LichessApi;
29use crate::error::{Error, Result};
30use crate::model::{BodyBounds, ModelBounds, QueryBounds, Request, Response};
31
32impl LichessApi<reqwest::Client> {
33 pub async fn get_ok<Q, B>(&self, request: Request<Q, B>) -> Result<bool>
34 where
35 Q: QueryBounds,
36 B: BodyBounds,
37 {
38 let result = self
39 .get_single_model::<Q, B, crate::model::Ok>(request)
40 .await;
41 Ok(result?.ok)
42 }
43
44 pub async fn get_pgn<Q, B>(
45 &self,
46 request: Request<Q, B>,
47 ) -> Result<impl StreamExt<Item = Result<String>>>
48 where
49 Q: QueryBounds,
50 B: BodyBounds,
51 {
52 let request = request.into_http_request("application/x-chess-pgn")?;
53 let stream = self.make_request_as_raw_lines(request).await?;
54 Ok(stream)
55 }
56
57 pub async fn get_text<Q, B>(&self, request: Request<Q, B>) -> Result<String>
58 where
59 Q: QueryBounds,
60 B: BodyBounds,
61 {
62 let request = request.into_http_request("text/plain")?;
63 let mut stream = self.make_request_as_raw_lines(request).await?;
64 let mut lines = Vec::new();
65 while let Some(line) = stream.next().await {
66 lines.push(line?);
67 }
68 Ok(lines.join("\n"))
69 }
70
71 pub async fn get_empty<Q, B>(&self, request: Request<Q, B>) -> Result<()>
72 where
73 Q: QueryBounds,
74 B: BodyBounds,
75 {
76 let request = request.into_http_request("application/json")?;
77 let mut stream = self.make_request(request).await?;
78 self.expect_empty(&mut stream).await?;
79 Ok(())
80 }
81
82 pub async fn get_single_model<Q, B, M>(&self, request: Request<Q, B>) -> Result<M>
83 where
84 Q: QueryBounds,
85 B: BodyBounds,
86 M: ModelBounds,
87 {
88 let request = request.into_http_request("application/json")?;
89 let mut stream = self.make_request(request).await?;
90 let res: Response<M> = self.expect_one_model(&mut stream).await?;
91 match res {
92 Response::Model(m) => Ok(m),
93 Response::Error { error } => Err(Error::LichessStatus(error)),
94 }
95 }
96
97 pub async fn get_streamed_models<Q, B, M>(
98 &self,
99 request: Request<Q, B>,
100 ) -> Result<impl StreamExt<Item = Result<M>>>
101 where
102 Q: QueryBounds,
103 B: BodyBounds,
104 M: ModelBounds,
105 {
106 let request = request.into_http_request("application/x-ndjson")?;
107 self.make_request(request).await
108 }
109}