rusty_gql/resolver/
list.rs1use std::collections::{HashSet, LinkedList, VecDeque};
2
3use crate::{
4 CollectFields, Context, FieldResolver, GqlValue, ResolverResult, SelectionSetContext,
5 SelectionSetResolver,
6};
7
8#[async_trait::async_trait]
9impl<T: FieldResolver, const N: usize> FieldResolver for [T; N] {
10 async fn resolve_field(&self, ctx: &Context<'_>) -> ResolverResult<Option<GqlValue>> {
11 let mut result = Vec::new();
12 for value in self {
13 if let Some(v) = value.resolve_field(ctx).await? {
14 result.push(v);
15 }
16 }
17 Ok(Some(GqlValue::List(result)))
18 }
19
20 fn type_name() -> String {
21 format!("[{}]!", T::type_name())
22 }
23}
24
25impl<T: FieldResolver, const N: usize> CollectFields for [T; N] {}
26
27#[async_trait::async_trait]
28impl<T: SelectionSetResolver, const N: usize> SelectionSetResolver for [T; N] {
29 async fn resolve_selection_set(
30 &self,
31 ctx: &SelectionSetContext<'_>,
32 ) -> ResolverResult<GqlValue> {
33 let mut result = Vec::new();
34 for value in self {
35 let v = value.resolve_selection_set(ctx).await?;
36 result.push(v);
37 }
38 Ok(GqlValue::List(result))
39 }
40}
41
42#[async_trait::async_trait]
43impl<T: FieldResolver> FieldResolver for HashSet<T> {
44 async fn resolve_field(&self, ctx: &Context<'_>) -> ResolverResult<Option<GqlValue>> {
45 let mut result = Vec::new();
46 for value in self {
47 if let Some(v) = value.resolve_field(ctx).await? {
48 result.push(v);
49 }
50 }
51 Ok(Some(GqlValue::List(result)))
52 }
53 fn type_name() -> String {
54 format!("[{}]!", T::type_name())
55 }
56}
57
58impl<T: FieldResolver> CollectFields for HashSet<T> {}
59
60#[async_trait::async_trait]
61impl<T: SelectionSetResolver> SelectionSetResolver for HashSet<T> {
62 async fn resolve_selection_set(
63 &self,
64 ctx: &SelectionSetContext<'_>,
65 ) -> ResolverResult<GqlValue> {
66 let mut result = Vec::new();
67 for value in self {
68 let v = value.resolve_selection_set(ctx).await?;
69 result.push(v);
70 }
71 Ok(GqlValue::List(result))
72 }
73}
74
75#[async_trait::async_trait]
76impl<'a, T: FieldResolver + 'a> FieldResolver for &'a [T] {
77 async fn resolve_field(&self, ctx: &Context<'_>) -> ResolverResult<Option<GqlValue>> {
78 let mut result = Vec::new();
79 for value in self.iter() {
80 if let Some(v) = value.resolve_field(ctx).await? {
81 result.push(v);
82 }
83 }
84 Ok(Some(GqlValue::List(result)))
85 }
86 fn type_name() -> String {
87 format!("[{}]!", T::type_name())
88 }
89}
90
91impl<'a, T: FieldResolver + 'a> CollectFields for &'a [T] {}
92
93#[async_trait::async_trait]
94impl<'a, T: SelectionSetResolver + 'a> SelectionSetResolver for &'a [T] {
95 async fn resolve_selection_set(
96 &self,
97 ctx: &SelectionSetContext<'_>,
98 ) -> ResolverResult<GqlValue> {
99 let mut result = Vec::new();
100 for value in self.iter() {
101 let v = value.resolve_selection_set(ctx).await?;
102 result.push(v);
103 }
104 Ok(GqlValue::List(result))
105 }
106}
107
108#[async_trait::async_trait]
109impl<T: FieldResolver> FieldResolver for VecDeque<T> {
110 async fn resolve_field(&self, ctx: &Context<'_>) -> ResolverResult<Option<GqlValue>> {
111 let mut result = Vec::new();
112 for value in self.iter() {
113 if let Some(v) = value.resolve_field(ctx).await? {
114 result.push(v);
115 }
116 }
117 Ok(Some(GqlValue::List(result)))
118 }
119 fn type_name() -> String {
120 format!("[{}]!", T::type_name())
121 }
122}
123
124impl<T: FieldResolver> CollectFields for VecDeque<T> {}
125
126#[async_trait::async_trait]
127impl<T: SelectionSetResolver> SelectionSetResolver for VecDeque<T> {
128 async fn resolve_selection_set(
129 &self,
130 ctx: &SelectionSetContext<'_>,
131 ) -> ResolverResult<GqlValue> {
132 let mut result = Vec::new();
133 for value in self.iter() {
134 let v = value.resolve_selection_set(ctx).await?;
135 result.push(v);
136 }
137 Ok(GqlValue::List(result))
138 }
139}
140
141#[async_trait::async_trait]
142impl<T: FieldResolver> FieldResolver for LinkedList<T> {
143 async fn resolve_field(&self, ctx: &Context<'_>) -> ResolverResult<Option<GqlValue>> {
144 let mut result = Vec::new();
145 for value in self.iter() {
146 if let Some(v) = value.resolve_field(ctx).await? {
147 result.push(v);
148 }
149 }
150 Ok(Some(GqlValue::List(result)))
151 }
152 fn type_name() -> String {
153 format!("[{}]!", T::type_name())
154 }
155}
156
157impl<T: FieldResolver> CollectFields for LinkedList<T> {}
158
159#[async_trait::async_trait]
160impl<T: SelectionSetResolver> SelectionSetResolver for LinkedList<T> {
161 async fn resolve_selection_set(
162 &self,
163 ctx: &SelectionSetContext<'_>,
164 ) -> ResolverResult<GqlValue> {
165 let mut result = Vec::new();
166 for value in self.iter() {
167 let v = value.resolve_selection_set(ctx).await?;
168 result.push(v);
169 }
170 Ok(GqlValue::List(result))
171 }
172}
173
174#[async_trait::async_trait]
175impl<T: FieldResolver> FieldResolver for Vec<T> {
176 async fn resolve_field(&self, ctx: &Context<'_>) -> ResolverResult<Option<GqlValue>> {
177 let mut result = Vec::new();
178 for value in self.iter() {
179 if let Some(v) = value.resolve_field(ctx).await? {
180 result.push(v);
181 }
182 }
183 Ok(Some(GqlValue::List(result)))
184 }
185 fn type_name() -> String {
186 format!("[{}]!", T::type_name())
187 }
188}
189
190impl<T: FieldResolver> CollectFields for Vec<T> {}
191
192#[async_trait::async_trait]
193impl<T: SelectionSetResolver> SelectionSetResolver for Vec<T> {
194 async fn resolve_selection_set(
195 &self,
196 ctx: &SelectionSetContext<'_>,
197 ) -> ResolverResult<GqlValue> {
198 let mut result = Vec::new();
199 for value in self.iter() {
200 let v = value.resolve_selection_set(ctx).await?;
201 result.push(v);
202 }
203 Ok(GqlValue::List(result))
204 }
205}