grafbase_sdk/types/elements/
response.rs1use crate::{SdkError, cbor, sealed::Sealed, types::authorization::private::QueryElementOrResponseItem, wit};
2use serde::Deserialize;
3
4use super::QueryElementId;
5
6#[derive(Clone, Copy)]
8pub struct ResponseElements<'a>(&'a wit::ResponseElements);
9
10impl<'a> From<&'a wit::ResponseElements> for ResponseElements<'a> {
11 fn from(value: &'a wit::ResponseElements) -> Self {
12 Self(value)
13 }
14}
15
16#[allow(clippy::len_without_is_empty)]
18impl<'a> ResponseElements<'a> {
19 pub fn len(&self) -> usize {
21 self.0.elements.len()
22 }
23
24 pub fn iter(&self) -> impl ExactSizeIterator<Item = ResponseElement<'a>> + 'a {
27 (*self).into_iter()
28 }
29
30 pub fn iter_grouped_by_directive_name(
32 &self,
33 ) -> impl ExactSizeIterator<Item = (&'a str, impl ExactSizeIterator<Item = ResponseElement<'a>> + 'a)> + 'a {
34 let resp = self.0;
35 let items = &resp.items;
36 self.0.directive_names.iter().map(move |(name, start, end)| {
37 let start = *start;
38 (
39 name.as_str(),
40 resp.elements[start as usize..*end as usize]
41 .iter()
42 .map(move |inner| ResponseElement {
43 items,
44 query_element_id: QueryElementId(inner.query_element_id),
45 items_range: inner.items_range,
46 }),
47 )
48 })
49 }
50}
51
52impl<'a> IntoIterator for ResponseElements<'a> {
53 type Item = ResponseElement<'a>;
54 type IntoIter = ResponseElementsIterator<'a>;
55 fn into_iter(self) -> Self::IntoIter {
56 ResponseElementsIterator {
57 items: &self.0.items,
58 iter: self.0.elements.iter(),
59 }
60 }
61}
62
63pub struct ResponseElementsIterator<'a> {
65 items: &'a [Vec<u8>],
66 iter: std::slice::Iter<'a, wit::ResponseElement>,
67}
68
69impl ExactSizeIterator for ResponseElementsIterator<'_> {}
70
71impl<'a> Iterator for ResponseElementsIterator<'a> {
72 type Item = ResponseElement<'a>;
73 fn next(&mut self) -> Option<Self::Item> {
74 let items = self.items;
75 self.iter.next().map(move |inner| ResponseElement {
76 items,
77 query_element_id: QueryElementId(inner.query_element_id),
78 items_range: inner.items_range,
79 })
80 }
81 fn size_hint(&self) -> (usize, Option<usize>) {
82 self.iter.size_hint()
83 }
84}
85
86#[derive(Clone, Copy)]
88pub struct ResponseElement<'a> {
89 items: &'a [Vec<u8>],
90 query_element_id: QueryElementId,
91 items_range: (u32, u32),
92}
93
94impl<'a> ResponseElement<'a> {
95 pub fn query_element_id(&self) -> QueryElementId {
102 self.query_element_id
103 }
104
105 pub fn items(&self) -> impl ExactSizeIterator<Item = ResponseItem<'a>> {
108 let (start, end) = self.items_range;
109 self.items[start as usize..end as usize]
110 .iter()
111 .enumerate()
112 .map(move |(offset, bytes)| ResponseItem {
113 bytes,
114 ix: start + offset as u32,
115 })
116 }
117}
118
119impl Sealed for ResponseItem<'_> {}
120impl QueryElementOrResponseItem for ResponseItem<'_> {
121 fn ix(&self) -> u32 {
122 self.ix
123 }
124}
125
126pub struct ResponseItem<'a> {
129 bytes: &'a [u8],
130 pub(in crate::types) ix: u32,
131}
132
133impl<'a> ResponseItem<'a> {
134 pub fn directive_arguments<T>(&self) -> Result<T, SdkError>
137 where
138 T: Deserialize<'a>,
139 {
140 cbor::from_slice(self.bytes).map_err(Into::into)
141 }
142}