rusty_gql/resolver/
object.rs1use std::collections::{BTreeMap, HashMap};
2
3use serde::Serialize;
4
5use crate::{
6 types::value::serialize_into_gql_value, CollectFields, Context, FieldResolver, GqlValue,
7 ResolverResult, SelectionSetContext, SelectionSetResolver,
8};
9
10#[async_trait::async_trait]
11impl<K, V> FieldResolver for BTreeMap<K, V>
12where
13 K: ToString + Eq + Send + Sync,
14 V: Serialize + Send + Sync,
15{
16 async fn resolve_field(&self, _ctx: &Context<'_>) -> ResolverResult<Option<GqlValue>> {
17 let mut map = BTreeMap::new();
18 for (name, v) in self {
19 map.insert(
20 name.to_string(),
21 serialize_into_gql_value(v).unwrap_or_default(),
22 );
23 }
24 Ok(Some(GqlValue::Object(map)))
25 }
26 fn type_name() -> String {
27 "Object".to_string()
28 }
29}
30
31impl<K, V> CollectFields for BTreeMap<K, V>
32where
33 K: ToString + Eq + Send + Sync,
34 V: Serialize + Send + Sync,
35{
36}
37
38#[async_trait::async_trait]
39impl<K, V> SelectionSetResolver for BTreeMap<K, V>
40where
41 K: ToString + Eq + Send + Sync,
42 V: Serialize + Send + Sync,
43{
44 async fn resolve_selection_set(
45 &self,
46 _ctx: &SelectionSetContext<'_>,
47 ) -> ResolverResult<GqlValue> {
48 let mut map = BTreeMap::new();
49 for (name, v) in self {
50 map.insert(
51 name.to_string(),
52 serialize_into_gql_value(v).unwrap_or_default(),
53 );
54 }
55 Ok(GqlValue::Object(map))
56 }
57}
58
59#[async_trait::async_trait]
60impl<K, V> FieldResolver for HashMap<K, V>
61where
62 K: ToString + Eq + Send + Sync,
63 V: Serialize + Send + Sync,
64{
65 async fn resolve_field(&self, _ctx: &Context<'_>) -> ResolverResult<Option<GqlValue>> {
66 let mut map = BTreeMap::new();
67 for (name, v) in self {
68 map.insert(
69 name.to_string(),
70 serialize_into_gql_value(v).unwrap_or_default(),
71 );
72 }
73 Ok(Some(GqlValue::Object(map)))
74 }
75 fn type_name() -> String {
76 "Object".to_string()
77 }
78}
79
80impl<K, V> CollectFields for HashMap<K, V>
81where
82 K: ToString + Eq + Send + Sync,
83 V: Serialize + Send + Sync,
84{
85}
86
87#[async_trait::async_trait]
88impl<K, V> SelectionSetResolver for HashMap<K, V>
89where
90 K: ToString + Eq + Send + Sync,
91 V: Serialize + Send + Sync,
92{
93 async fn resolve_selection_set(
94 &self,
95 _ctx: &SelectionSetContext<'_>,
96 ) -> ResolverResult<GqlValue> {
97 let mut map = BTreeMap::new();
98 for (name, v) in self {
99 map.insert(
100 name.to_string(),
101 serialize_into_gql_value(v).unwrap_or_default(),
102 );
103 }
104 Ok(GqlValue::Object(map))
105 }
106}