lichess_api/api/
mod.rs

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}