From 8d2269785587017c65880d4312e49ca03d9bce34 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sun, 28 Jan 2024 03:36:17 -0500 Subject: [PATCH] better environment variable errors --- crates/lib/easyenv/src/error.rs | 19 +++++++++++++++++-- crates/lib/easyenv/src/types/boolean.rs | 2 +- crates/lib/easyenv/src/types/duration.rs | 2 +- crates/lib/easyenv/src/types/pathbuf.rs | 2 +- crates/lib/easyenv/src/types/string.rs | 2 +- 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/crates/lib/easyenv/src/error.rs b/crates/lib/easyenv/src/error.rs index 591f8b6b10..241dbf194d 100644 --- a/crates/lib/easyenv/src/error.rs +++ b/crates/lib/easyenv/src/error.rs @@ -13,7 +13,10 @@ pub enum EnvError { reason: String }, /// The required environment variable wasn't present. - RequiredNotPresent, + RequiredNotPresent { + /// The name of the missing environment variable. + name: String + }, } impl Display for EnvError { @@ -21,7 +24,19 @@ impl Display for EnvError { let reason = match self { EnvError::NotUnicode => "EnvError::NotUnicode", EnvError::ParseError { .. } => "EnvError::ParseError", - EnvError::RequiredNotPresent => "EnvError::RequiredNotPresent", + EnvError::RequiredNotPresent { name } => + return write!(f, r#" + EnvError::RequiredNotPresent: the following environment variable was not present: + + ---> {:?} + + In development, setting it in the environment config files: .env, .env-secrets, + cargo/service/../{{app_name}}/config/{{app_name}}.development.env, etc. + + If it looks like it might be a secret, ask for help in our company Discord. + + In production, make sure these environment variables are set in Kubernetes. + "#, name), }; write!(f, "{:?}", reason) } diff --git a/crates/lib/easyenv/src/types/boolean.rs b/crates/lib/easyenv/src/types/boolean.rs index d3f269d191..c0aacb21ba 100644 --- a/crates/lib/easyenv/src/types/boolean.rs +++ b/crates/lib/easyenv/src/types/boolean.rs @@ -51,7 +51,7 @@ pub fn get_env_bool_required(env_name: &str) -> Result { .and_then(|maybe| match maybe { None => { warn!("Env var '{}' not supplied.", env_name); - Err(EnvError::RequiredNotPresent) + Err(EnvError::RequiredNotPresent { name: env_name.to_string() }) }, Some(val) => Ok(val), }) diff --git a/crates/lib/easyenv/src/types/duration.rs b/crates/lib/easyenv/src/types/duration.rs index 01728ac3c7..b24b7523d2 100644 --- a/crates/lib/easyenv/src/types/duration.rs +++ b/crates/lib/easyenv/src/types/duration.rs @@ -12,7 +12,7 @@ pub fn get_env_duration_seconds_required(env_name: &str) -> Result { warn!("Env var '{}' not supplied.", env_name); - Err(EnvError::RequiredNotPresent) + Err(EnvError::RequiredNotPresent { name: env_name.to_string() }) }, Some(val) => Ok(val), }) diff --git a/crates/lib/easyenv/src/types/pathbuf.rs b/crates/lib/easyenv/src/types/pathbuf.rs index d95d6833f5..5c29258368 100644 --- a/crates/lib/easyenv/src/types/pathbuf.rs +++ b/crates/lib/easyenv/src/types/pathbuf.rs @@ -15,7 +15,7 @@ pub fn get_env_pathbuf_required(env_name: &str) -> Result { .and_then(|maybe| match maybe { None => { warn!("Env var '{}' not supplied.", env_name); - Err(EnvError::RequiredNotPresent) + Err(EnvError::RequiredNotPresent { name: env_name.to_string() }) }, Some(val) => Ok(val), }) diff --git a/crates/lib/easyenv/src/types/string.rs b/crates/lib/easyenv/src/types/string.rs index 39640a8755..899ff42830 100644 --- a/crates/lib/easyenv/src/types/string.rs +++ b/crates/lib/easyenv/src/types/string.rs @@ -32,7 +32,7 @@ pub fn get_env_string_required(env_name: &str) -> Result { Some(s) => Ok(s.to_string()), None => { warn!("Required env var '{}' not supplied.", env_name); - Err(EnvError::RequiredNotPresent) + Err(EnvError::RequiredNotPresent { name: env_name.to_string() }) }, } }