1pub mod account;
2pub mod analysis;
3pub mod board;
4pub mod bot;
5pub mod challenges;
6pub mod external_engine;
7pub mod fide;
8pub mod games;
9pub mod messaging;
10pub mod oauth;
11pub mod openings;
12pub mod puzzles;
13pub mod relations;
14pub mod simuls;
15pub mod studies;
16pub mod tablebase;
17pub mod tv;
18pub mod users;
19
20use async_std::stream::StreamExt;
21
22use crate::client::LichessApi;
23use crate::error::{Error, Result};
24use crate::model::{BodyBounds, ModelBounds, QueryBounds, Request, Response};
25
26impl LichessApi<reqwest::Client> {
27 pub async fn get_ok<Q, B>(&self, request: Request<Q, B>) -> Result<bool>
28 where
29 Q: QueryBounds,
30 B: BodyBounds,
31 {
32 let result = self
33 .get_single_model::<Q, B, crate::model::Ok>(request)
34 .await;
35 return Ok(result?.ok);
36 }
37
38 pub async fn get_pgn<Q, B>(
39 &self,
40 request: Request<Q, B>,
41 ) -> Result<impl StreamExt<Item = Result<String>>>
42 where
43 Q: QueryBounds,
44 B: BodyBounds,
45 {
46 let request = request.as_http_request("application/x-chess-pgn")?;
47 let stream = self.make_request_as_raw_lines(request).await?;
48 Ok(stream)
49 }
50
51 pub async fn get_empty<Q, B>(&self, request: Request<Q, B>) -> Result<()>
52 where
53 Q: QueryBounds,
54 B: BodyBounds,
55 {
56 let request = request.as_http_request("application/json")?;
57 let mut stream = self.make_request(request).await?;
58 self.expect_empty(&mut stream).await?;
59 Ok(())
60 }
61
62 pub async fn get_single_model<Q, B, M>(&self, request: Request<Q, B>) -> Result<M>
63 where
64 Q: QueryBounds,
65 B: BodyBounds,
66 M: ModelBounds,
67 {
68 let request = request.as_http_request("application/json")?;
69 let mut stream = self.make_request(request).await?;
70 let res: Response<M> = self.expect_one_model(&mut stream).await?;
71 match res {
72 Response::Model(m) => Ok(m),
73 Response::Error { error } => Err(Error::LichessStatus(error)),
74 }
75 }
76
77 pub async fn get_streamed_models<Q, B, M>(
78 &self,
79 request: Request<Q, B>,
80 ) -> Result<impl StreamExt<Item = Result<M>>>
81 where
82 Q: QueryBounds,
83 B: BodyBounds,
84 M: ModelBounds,
85 {
86 let request = request.as_http_request("application/x-ndjson")?;
87 self.make_request(request).await
88 }
89}