reactive_graph_config_model/
remotes.rs

1use std::cmp::Ordering;
2use std::collections::HashSet;
3use std::collections::hash_set::IntoIter;
4use std::ops::Deref;
5use std::ops::DerefMut;
6
7use serde::Deserialize;
8use serde::Serialize;
9use serde::Serializer;
10
11use reactive_graph_remotes_model::DEFAULT_ENDPOINT_DYNAMIC_GRAPH;
12use reactive_graph_remotes_model::DEFAULT_ENDPOINT_GRAPHQL;
13use reactive_graph_remotes_model::DEFAULT_ENDPOINT_PLUGIN;
14use reactive_graph_remotes_model::DEFAULT_ENDPOINT_RUNTIME;
15use reactive_graph_remotes_model::DEFAULT_USER_AGENT;
16use reactive_graph_remotes_model::InstanceAddress;
17
18#[derive(Debug, Clone, Default, Serialize, Deserialize)]
19pub struct RemotesConfig {
20    #[serde(serialize_with = "sorted_address_set")]
21    remotes: HashSet<InstanceAddress>,
22}
23
24impl RemotesConfig {
25    pub fn new(remotes: HashSet<InstanceAddress>) -> Self {
26        RemotesConfig { remotes }
27    }
28
29    pub fn merge(&mut self, mut address: InstanceAddress) {
30        if let Some(address_2) = self.remotes.iter().find(|a| a == &&address) {
31            if address.user_agent == DEFAULT_USER_AGENT && address_2.user_agent != DEFAULT_USER_AGENT {
32                address.user_agent = address_2.user_agent.clone();
33            }
34            if address.endpoint_graphql == DEFAULT_ENDPOINT_GRAPHQL && address_2.endpoint_graphql != DEFAULT_ENDPOINT_GRAPHQL {
35                address.endpoint_graphql = address_2.endpoint_graphql.clone();
36            }
37            if address.endpoint_dynamic_graph == DEFAULT_ENDPOINT_DYNAMIC_GRAPH && address_2.endpoint_dynamic_graph != DEFAULT_ENDPOINT_DYNAMIC_GRAPH {
38                address.endpoint_dynamic_graph = address_2.endpoint_dynamic_graph.clone();
39            }
40            if address.endpoint_runtime == DEFAULT_ENDPOINT_RUNTIME && address_2.endpoint_runtime != DEFAULT_ENDPOINT_RUNTIME {
41                address.endpoint_runtime = address_2.endpoint_runtime.clone();
42            }
43            if address.endpoint_plugin == DEFAULT_ENDPOINT_PLUGIN && address_2.endpoint_plugin != DEFAULT_ENDPOINT_PLUGIN {
44                address.endpoint_plugin = address_2.endpoint_plugin.clone();
45            }
46            if address.bearer.is_none() && address_2.bearer.is_some() {
47                address.bearer = address_2.bearer.clone();
48            }
49            let _ = self.remotes.replace(address);
50        }
51    }
52}
53
54impl IntoIterator for RemotesConfig {
55    type Item = InstanceAddress;
56    type IntoIter = IntoIter<InstanceAddress>;
57
58    fn into_iter(self) -> Self::IntoIter {
59        self.remotes.into_iter()
60    }
61}
62
63impl Deref for RemotesConfig {
64    type Target = HashSet<InstanceAddress>;
65
66    fn deref(&self) -> &Self::Target {
67        &self.remotes
68    }
69}
70
71impl DerefMut for RemotesConfig {
72    fn deref_mut(&mut self) -> &mut Self::Target {
73        &mut self.remotes
74    }
75}
76
77fn sorted_address_set<S>(value: &HashSet<InstanceAddress>, serializer: S) -> Result<S::Ok, S::Error>
78where
79    S: Serializer,
80{
81    let mut ordered: Vec<_> = value.iter().collect();
82    ordered.sort_by(|a1, a2| match a1.hostname.cmp(&a2.hostname) {
83        Ordering::Less => Ordering::Less,
84        Ordering::Greater => Ordering::Greater,
85        Ordering::Equal => a1.port.cmp(&a2.port),
86    });
87    ordered.serialize(serializer)
88}