rusty_gql/resolver/
object.rs

1use 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}