Skip to main content

lichess_api/api/
mod.rs

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}