fn build()

in core/src/services/etcd/backend.rs [181:220]


    fn build(&mut self) -> Result<Self::Accessor> {
        let endpoints = self
            .endpoints
            .clone()
            .unwrap_or_else(|| DEFAULT_ETCD_ENDPOINTS.to_string());

        let endpoints: Vec<String> = endpoints.split(',').map(|s| s.to_string()).collect();

        let mut options = ConnectOptions::new();

        if self.ca_path.is_some() && self.cert_path.is_some() && self.key_path.is_some() {
            let ca = self.load_pem(self.ca_path.clone().unwrap().as_str())?;
            let key = self.load_pem(self.key_path.clone().unwrap().as_str())?;
            let cert = self.load_pem(self.cert_path.clone().unwrap().as_str())?;

            let tls_options = TlsOptions::default()
                .ca_certificate(Certificate::from_pem(ca))
                .identity(Identity::from_pem(cert, key));
            options = options.with_tls(tls_options);
        }

        if let Some(username) = self.username.clone() {
            options = options.with_user(username, self.password.clone().unwrap_or("".to_string()));
        }

        let root = normalize_root(
            self.root
                .clone()
                .unwrap_or_else(|| "/".to_string())
                .as_str(),
        );

        let client = OnceCell::new();
        Ok(EtcdBackend::new(Adapter {
            endpoints,
            client,
            options,
        })
        .with_root(root.as_str()))
    }