summaryrefslogtreecommitdiff
path: root/rest/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rest/src/main.rs')
-rw-r--r--rest/src/main.rs46
1 files changed, 46 insertions, 0 deletions
diff --git a/rest/src/main.rs b/rest/src/main.rs
new file mode 100644
index 0000000..ae993d9
--- /dev/null
+++ b/rest/src/main.rs
@@ -0,0 +1,46 @@
+use std::{convert::Infallible, sync::Arc};
+
+use crate::{config::Config, ratelimit::Ratelimiter};
+use common::{
+ config::Settings,
+ log::{error, info},
+ redis_crate::Client,
+};
+use hyper::{server::conn::AddrStream, service::make_service_fn, Server};
+use std::net::ToSocketAddrs;
+use tokio::sync::Mutex;
+
+use crate::proxy::ServiceProxy;
+
+mod config;
+mod proxy;
+mod ratelimit;
+
+#[tokio::main]
+async fn main() {
+ let settings: Settings<Config> = Settings::new("rest").unwrap();
+ let config = Arc::new(settings.config);
+ let redis_client: Client = settings.redis.into();
+ let redis = Arc::new(Mutex::new(
+ redis_client.get_async_connection().await.unwrap(),
+ ));
+ let ratelimiter = Arc::new(Ratelimiter::new(redis));
+
+ let addr = format!("{}:{}", config.server.address, config.server.port)
+ .to_socket_addrs()
+ .unwrap()
+ .next()
+ .unwrap();
+
+ let service_fn = make_service_fn(move |_: &AddrStream| {
+ let service_proxy = ServiceProxy::new(config.clone(), ratelimiter.clone());
+ async move { Ok::<_, Infallible>(service_proxy) }
+ });
+
+ let server = Server::bind(&addr).serve(service_fn);
+
+ info!("starting ratelimit server");
+ if let Err(e) = server.await {
+ error!("server error: {}", e);
+ }
+}