use crate::utils::filewatch; use crate::utils::kuberconsul::{ConsulDiscovery, KubernetesDiscovery, ServiceDiscovery}; use crate::utils::structs::Configuration; use crate::web::webserver; use async_trait::async_trait; use futures::channel::mpsc::Sender; use std::sync::Arc; pub struct APIUpstreamProvider { pub config_api_enabled: bool, pub address: String, pub masterkey: String, pub tls_address: Option, pub tls_certificate: Option, pub tls_key_file: Option, pub file_server_address: Option, pub file_server_folder: Option, } #[async_trait] impl Discovery for APIUpstreamProvider { async fn start(&self, toreturn: Sender) { webserver::run_server(self, toreturn).await; } } pub struct FromFileProvider { pub path: String, } pub struct ConsulProvider { pub config: Arc, } pub struct KubernetesProvider { pub config: Arc, } #[async_trait] pub trait Discovery { async fn start(&self, tx: Sender); } #[async_trait] impl Discovery for FromFileProvider { async fn start(&self, tx: Sender) { tokio::spawn(filewatch::start(self.path.clone(), tx.clone())); } } #[async_trait] impl Discovery for ConsulProvider { async fn start(&self, tx: Sender) { tokio::spawn(ConsulDiscovery.fetch_upstreams(self.config.clone(), tx)); } } #[async_trait] impl Discovery for KubernetesProvider { async fn start(&self, tx: Sender) { tokio::spawn(KubernetesDiscovery.fetch_upstreams(self.config.clone(), tx)); } }