alpaca_data/news/
client.rs

1use std::sync::Arc;
2
3use crate::{
4    Error,
5    client::Inner,
6    common::response::ResponseStream,
7    transport::endpoint::Endpoint,
8    transport::pagination::{collect_all, stream_pages},
9};
10
11use super::{ListRequest, ListResponse};
12
13#[derive(Clone, Debug)]
14pub struct NewsClient {
15    inner: Arc<Inner>,
16}
17
18impl NewsClient {
19    pub(crate) fn new(inner: Arc<Inner>) -> Self {
20        Self { inner }
21    }
22
23    pub async fn list(&self, request: ListRequest) -> Result<ListResponse, Error> {
24        self.ensure_credentials()?;
25        request.validate()?;
26        self.inner
27            .http
28            .get_json(
29                &self.inner.base_url,
30                Endpoint::NewsList,
31                &self.inner.auth,
32                request.to_query(),
33            )
34            .await
35    }
36
37    pub async fn list_all(&self, request: ListRequest) -> Result<ListResponse, Error> {
38        self.ensure_credentials()?;
39        let client = self.clone();
40
41        collect_all(request, move |request| {
42            let client = client.clone();
43            async move { client.list(request).await }
44        })
45        .await
46    }
47
48    pub fn list_stream(&self, request: ListRequest) -> ResponseStream<Result<ListResponse, Error>> {
49        if let Err(error) = self.ensure_credentials() {
50            return Self::error_stream(error);
51        }
52
53        let client = self.clone();
54        stream_pages(request, move |request| {
55            let client = client.clone();
56            async move { client.list(request).await }
57        })
58    }
59
60    fn ensure_credentials(&self) -> Result<(), Error> {
61        if self.inner.auth.has_credentials() {
62            Ok(())
63        } else {
64            Err(Error::MissingCredentials)
65        }
66    }
67
68    fn error_stream<Response>(error: Error) -> ResponseStream<Result<Response, Error>>
69    where
70        Response: Send + 'static,
71    {
72        Box::pin(futures_util::stream::once(async move { Err(error) }))
73    }
74}