1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
use async_trait::async_trait;
use getset::Getters;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::error::Error;
#[derive(Debug, Getters, Clone, Serialize, Deserialize)]
pub struct Port {
name: Option<String>,
port: u32,
protocol: String,
app_protocol: Option<String>,
}
impl Port {
pub fn new(
name: Option<String>,
port: u32,
protocol: String,
app_protocol: Option<String>,
) -> Self {
Self {
name,
port,
protocol,
app_protocol,
}
}
pub fn get_name(&self) -> &Option<String> {
&self.name
}
pub fn get_port(&self) -> u32 {
self.port
}
pub fn get_protocol(&self) -> &str {
&self.protocol
}
pub fn get_app_protocol(&self) -> &Option<String> {
&self.app_protocol
}
}
#[derive(Debug, Getters, Clone, Serialize, Deserialize)]
pub struct ServiceInstance {
#[getset(get = "pub")]
instance_id: Option<String>,
#[getset(get = "pub")]
service_id: Option<String>,
host: Option<String>,
ports: Option<Vec<Port>>,
secure: bool,
#[getset(get = "pub")]
uri: Option<String>,
#[getset(get = "pub")]
metadata: HashMap<String, String>,
#[getset(get = "pub")]
scheme: Option<String>,
}
impl ServiceInstance {
#[allow(clippy::too_many_arguments)]
pub fn new(
instance_id: Option<String>,
service_id: Option<String>,
host: Option<String>,
ports: Option<Vec<Port>>,
secure: bool,
uri: Option<String>,
metadata: HashMap<String, String>,
scheme: Option<String>,
) -> Self {
ServiceInstance {
instance_id,
service_id,
host,
ports,
secure,
uri,
metadata,
scheme,
}
}
pub fn host(&self) -> &Option<String> {
&self.host
}
pub fn get_ports(&self) -> &Option<Vec<Port>> {
&self.ports
}
pub fn is_secure(&self) -> bool {
self.secure
}
}
#[async_trait]
pub trait DiscoveryService {
async fn discover_instances(&self) -> Result<Vec<ServiceInstance>, Box<dyn Error>>;
}
#[allow(dead_code)]
pub struct DiscoveryClient<T> {
service: T,
}
#[allow(dead_code)]
impl<T: DiscoveryService> DiscoveryClient<T> {
pub fn new(ds: T) -> DiscoveryClient<T> {
DiscoveryClient { service: ds }
}
pub async fn get_instances(&self) -> Result<Vec<ServiceInstance>, Box<dyn Error>> {
self.service.discover_instances().await
}
}