summaryrefslogtreecommitdiff
path: root/common/rust/src/nats.rs
blob: 59b480c7239bc881b7910394646ce0e2e159771a (plain)
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
use nats::{Options, Connection};
use serde::Deserialize;

#[derive(Clone, Debug, Deserialize)]
struct NatsConfigurationClientCert {
    cert: String,
    key: String
}
#[derive(Clone, Debug, Deserialize)]
struct NatsConfigurationTls {
    mtu: Option<usize>,
}

#[derive(Clone, Debug, Deserialize)]
pub struct NatsConfiguration {
    client_cert: Option<NatsConfigurationClientCert>,
    root_cert: Option<Vec<String>>,
    jetstream_api_prefix: Option<String>,
    max_reconnects: Option<usize>,
    reconnect_buffer_size: Option<usize>,
    tls: Option<NatsConfigurationTls>,
    client_name: Option<String>,
    tls_required: Option<bool>,
    host: String,
}

/// 
impl Into<Connection> for NatsConfiguration {
    fn into(self) -> Connection {
        let mut options = Options::new();
        
        if let Some(client_cert) = self.client_cert {
            options = options.client_cert(client_cert.cert, client_cert.key);
        }

        if let Some(root_certs) = self.root_cert {
            for root_cert in root_certs {
                options = options.add_root_certificate(root_cert);
            }
        }

        if let Some(jetstream_api_prefix) = self.jetstream_api_prefix {
            options = options.jetstream_api_prefix(jetstream_api_prefix)
        }

        options = options.max_reconnects(self.max_reconnects);
        options = options.no_echo();
        options = options.reconnect_buffer_size(self.reconnect_buffer_size.unwrap_or(64 * 1024));
        options = options.tls_required(self.tls_required.unwrap_or(false));
        options = options.with_name(&self.client_name.unwrap_or("Nova".to_string()));


        if let Some(tls) = self.tls {
            let mut config = nats::rustls::ClientConfig::new();
            config.set_mtu(&tls.mtu);
            // todo: more options?
            options = options.tls_client_config(config);
        }

        options.connect(&self.host).unwrap()
    }
}