reactive_graph_config_model/
remotes.rs1use 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}