ytmapi_rs/query/
continuations.rs1use 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
9pub struct GetContinuationsQuery<'a, Q> {
12 query: &'a Q,
13 continuation_params: ContinuationParams<'static>,
14}
15
16impl<'a, Q> GetContinuationsQuery<'a, Q> {
17 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}