Skip to main content

ytmapi_rs/query/
continuations.rs

1use super::{PostMethod, PostQuery, Query};
2use crate::ProcessedResult;
3use crate::auth::AuthToken;
4use crate::common::{ContinuationParams, YoutubeID};
5use crate::continuations::ParseFromContinuable;
6use std::borrow::Cow;
7use std::vec::Vec;
8
9/// Query that will get continuations for a query that returned paginated
10/// results.
11pub struct GetContinuationsQuery<'a, Q> {
12    query: &'a Q,
13    continuation_params: ContinuationParams<'static>,
14}
15
16impl<'a, Q> GetContinuationsQuery<'a, Q> {
17    /// Create a GetContinuationsQuery with dummy continuation params - for
18    /// testing purposes.
19    pub fn new_mock_unchecked(query: &'a Q) -> GetContinuationsQuery<'a, Q> {
20        GetContinuationsQuery {
21            query,
22            continuation_params: ContinuationParams::from_raw(""),
23        }
24    }
25}
26impl<'a, Q> GetContinuationsQuery<'a, Q> {
27    pub fn from_first_result<T: ParseFromContinuable<Q>>(
28        res: ProcessedResult<'a, Q>,
29    ) -> crate::Result<(T, Option<GetContinuationsQuery<'a, Q>>)> {
30        let query = res.query;
31        let (res, continuation_params) = T::parse_from_continuable(res)?;
32        let maybe_continuation_query =
33            continuation_params.map(|continuation_params| GetContinuationsQuery {
34                continuation_params,
35                query,
36            });
37        Ok((res, maybe_continuation_query))
38    }
39    pub fn from_continuation<'b, T: ParseFromContinuable<Q>>(
40        res: ProcessedResult<'a, GetContinuationsQuery<'b, Q>>,
41    ) -> crate::Result<(T, Option<GetContinuationsQuery<'b, Q>>)> {
42        let query = res.query.query;
43        let (res, continuation_params) = T::parse_continuation(res)?;
44        let maybe_continuation_query =
45            continuation_params.map(|continuation_params| GetContinuationsQuery {
46                continuation_params,
47                query,
48            });
49        Ok((res, maybe_continuation_query))
50    }
51}
52
53impl<T, Q> ParseFromContinuable<GetContinuationsQuery<'_, Q>> for T
54where
55    T: std::fmt::Debug + Sized,
56    T: ParseFromContinuable<Q>,
57{
58    fn parse_from_continuable(
59        p: ProcessedResult<GetContinuationsQuery<Q>>,
60    ) -> crate::Result<(Self, Option<ContinuationParams<'static>>)> {
61        T::parse_continuation(p)
62    }
63    fn parse_continuation(
64        p: ProcessedResult<GetContinuationsQuery<'_, GetContinuationsQuery<Q>>>,
65    ) -> crate::Result<(Self, Option<ContinuationParams<'static>>)> {
66        let ProcessedResult {
67            query,
68            source,
69            json,
70        } = p;
71        let p = ProcessedResult {
72            query: query.query,
73            source,
74            json,
75        };
76        T::parse_continuation(p)
77    }
78}
79
80impl<Q: Query<A>, A: AuthToken> Query<A> for GetContinuationsQuery<'_, Q>
81where
82    Q: PostQuery,
83    Q::Output: ParseFromContinuable<Self>,
84{
85    type Output = Q::Output;
86    type Method = PostMethod;
87}
88
89impl<Q> PostQuery for GetContinuationsQuery<'_, Q>
90where
91    Q: PostQuery,
92{
93    fn header(&self) -> serde_json::Map<String, serde_json::Value> {
94        self.query.header()
95    }
96    fn params(&self) -> Vec<(&str, Cow<'_, str>)> {
97        let params = self.continuation_params.get_raw();
98        vec![("ctoken", params.into()), ("continuation", params.into())]
99    }
100    fn path(&self) -> &str {
101        self.query.path()
102    }
103}