alpaca_data/news/
client.rs1use 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}