diff options
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..1e71db2 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,103 @@ +use axum::extract::{Query, State}; +use axum::{Router, routing::get}; +use reqwest::Client; +use serde::{Deserialize, Serialize}; +use std::path::PathBuf; + +#[derive(Clone)] +struct AppState { + reqwest : Client, + config : Config, +} + +#[derive(Serialize, Debug)] +struct Webhook { + pub content : String, +} + +#[derive(Deserialize, Debug, Clone)] +struct Config { + webhook_public : String, + webhook_private : String, +} + +impl Config { + pub fn load(from : PathBuf) -> Config { + toml::from_str( + std::fs::read_to_string(from) + .expect("failed to read config") + .as_str(), + ) + .expect("failed to parse config") + } +} + +#[derive(Deserialize, Debug)] +struct OpenCloseQueryParam { + public : bool, +} + +async fn handle_startup() { + println!("can I haz button plz") +} + +async fn handle_open(State(state) : State<AppState>, query : Query<OpenCloseQueryParam>) { + state + .reqwest + .post( + if query.public { + state.config.webhook_public + } else { + state.config.webhook_private + }, + ) + .json(&Webhook { + content : "The space is now open!".to_string(), + }) + .send() + .await + .unwrap(); +} + +async fn handle_close(State(state) : State<AppState>, query : Query<OpenCloseQueryParam>) { + state + .reqwest + .post( + if query.public { + state.config.webhook_public + } else { + state.config.webhook_private + }, + ) + .json(&Webhook { + content : "The space is now closed!".to_string(), + }) + .send() + .await + .unwrap(); +} + +#[tokio::main] +async fn main() { + let config = if cfg!(debug_assertions) { + // use local config + Config::load(PathBuf::from("config.toml")) + } else { + // now it's in docker, use the bind config! + Config::load(PathBuf::from("/app/config.toml")) + }; + + let state = AppState { + reqwest : Client::new(), + config, + }; + + let app = Router::new() + .route("/startup", get(handle_startup)) + .route("/open", get(handle_open)) + .route("/close", get(handle_close)) + .with_state(state); + + let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); + axum::serve(listener, app).await.unwrap(); +} |
