summaryrefslogtreecommitdiff
path: root/exes/rest/src/main.rs
diff options
context:
space:
mode:
authorMatthieuCoder <matthieu@matthieu-dev.xyz>2022-12-31 17:07:30 +0400
committerMatthieuCoder <matthieu@matthieu-dev.xyz>2022-12-31 17:07:30 +0400
commit65652932f77ce194a10cbc8dd42f3064e2c1a132 (patch)
tree4ca18a9317c4e561e917e9dd0cf39b695b43bc34 /exes/rest/src/main.rs
parenta16bafdf5b0ec52fa0d73458597eee7c34ea5e7b (diff)
updates and bazel removal
Diffstat (limited to 'exes/rest/src/main.rs')
-rw-r--r--exes/rest/src/main.rs46
1 files changed, 46 insertions, 0 deletions
diff --git a/exes/rest/src/main.rs b/exes/rest/src/main.rs
new file mode 100644
index 0000000..9fa6ce7
--- /dev/null
+++ b/exes/rest/src/main.rs
@@ -0,0 +1,46 @@
+use std::{convert::Infallible, sync::Arc};
+
+use crate::{config::Config, ratelimit::Ratelimiter};
+use shared::{
+ 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);
+ }
+}