From 4675329334d4bee14f80faab1f4b09dcf61086f6 Mon Sep 17 00:00:00 2001 From: Orion Kindel Date: Thu, 13 Jul 2023 00:12:57 -0500 Subject: [PATCH] feat: read environment variables --- src/env.rs | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 17 ++++++++------- src/uuid.rs | 1 + 3 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 src/env.rs create mode 100644 src/uuid.rs diff --git a/src/env.rs b/src/env.rs new file mode 100644 index 0000000..59456ea --- /dev/null +++ b/src/env.rs @@ -0,0 +1,61 @@ +use std::ffi::OsString; +use std::net::{AddrParseError, SocketAddr}; +use std::str::FromStr; + +use naan::prelude::*; + +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +pub struct Api { + pub addr: SocketAddr, +} + +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +pub struct Postgres { + pub user: String, + pub pass: String, + pub host: String, + pub port: String, +} + +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +pub struct Env { + pub postgres: Postgres, + pub api: Api, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum Error { + VarNotUnicode(String, OsString), + VarNotSocketAddr(String, AddrParseError), + RequiredVarNotSet(String), +} + +impl Env { + pub fn try_read() -> Result { + fn get(k: &'static str) -> Result, Error> { + std::env::var("POSTGRES_USER").map(Some) + .recover(|e| match e { + | std::env::VarError::NotPresent => Ok(None), + | std::env::VarError::NotUnicode(os) => { + Err(Error::VarNotUnicode(k.into(), os)) + }, + }) + } + + fn get_required(k: &'static str) -> Result { + get(k)?.ok_or_else(|| Error::RequiredVarNotSet(k.into())) + } + + let postgres = Postgres { user: get_required("POSTGRES_USER")?, + host: get_required("POSTGRES_HOST")?, + pass: get_required("POSTGRES_PASS")?, + port: get_required("POSTGRES_PORT")? }; + + let api_addr = get("API_ADDR")?.unwrap_or("127.0.0.1:4444".into()); + + let api = Api { addr: api_addr.parse() + .map_err(|e| Error::VarNotSocketAddr("API_ADDR".into(), e))? }; + + Ok(Env { postgres, api }) + } +} diff --git a/src/main.rs b/src/main.rs index 90f6161..6df1927 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,10 +7,12 @@ use toad_msg::alloc::Message; use toad_msg::Type; mod app; +mod env; mod hashed_text; mod postgres; mod repo; mod user; +mod uuid; #[macro_export] macro_rules! newtype { @@ -94,8 +96,7 @@ fn handle_request(req: Addrd>) -> Result, String> { if path_segments.peek() == Some(&"users") { let mut path_segments = path_segments.clone(); - path_segments.next(); - let _id = path_segments.next(); + let _id = path_segments.nth(2); let msg = Message::builder(Type::Ack, toad::resp::code::NOT_FOUND).build(); Ok(Addrd(msg, req.addr())) } else { @@ -122,13 +123,13 @@ fn server_worker(p: &'static Toad) { fn main() { simple_logger::init().unwrap(); - static mut TOAD: Option = None; + let env = env::Env::try_read().unwrap(); - unsafe { - TOAD = Some(Toad::try_new("0.0.0.0:4444", Config::default()).unwrap()); - } + let toad = Toad::try_new(env.api.addr, Config::default()).unwrap(); - let r = unsafe { TOAD.as_ref().unwrap() }; + // SAFETY + // this is safe because the server worker cannot outlive the main thread + let toad_ref: &'static Toad = unsafe { core::mem::transmute(&toad) }; - server_worker(r); + server_worker(toad_ref); } diff --git a/src/uuid.rs b/src/uuid.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/uuid.rs @@ -0,0 +1 @@ +