From 042c78f3ab778984cdb3b904448f8038b43d2651 Mon Sep 17 00:00:00 2001 From: Lukas Kalbertodt Date: Sun, 10 Dec 2023 11:11:06 +0100 Subject: [PATCH] Allow "yes" & "no" for bool env vars and do case-insensitive matching Closes #34 --- CHANGELOG.md | 3 +++ src/env/mod.rs | 14 ++++++++++---- src/env/tests.rs | 9 +++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e3f61c8..09cddea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Add `#[config(partial_attr(...))]` struct attribute to specify attributes for the partial type. +- Allow "yes" and "no" as values when deserializing `bool` from env. Also, the + match is done completely case insensitive now, such that e.g. "True", "tRuE" + are accepted now. ## [0.2.4] - 2023-07-02 - Fixed enum deserialization from env values diff --git a/src/env/mod.rs b/src/env/mod.rs index d1cb600..365060c 100644 --- a/src/env/mod.rs +++ b/src/env/mod.rs @@ -85,10 +85,16 @@ impl<'de> serde::Deserializer<'de> for Deserializer { where V: serde::de::Visitor<'de>, { - let v = match self.value.trim() { - "1" | "true" | "TRUE" => true, - "0" | "false" | "FALSE" => false, - other => return Err(DeError(format!("invalid value for bool: '{other}'"))), + let s = self.value.trim(); + let v = match () { + () if s == "1" + || s.eq_ignore_ascii_case("true") + || s.eq_ignore_ascii_case("yes") => true, + + () if s == "0" + || s.eq_ignore_ascii_case("false") + || s.eq_ignore_ascii_case("no") => false, + _ => return Err(DeError(format!("invalid value for bool: '{s}'"))), }; visitor.visit_bool(v) diff --git a/src/env/tests.rs b/src/env/tests.rs index 7fdeb3e..e2a6c49 100644 --- a/src/env/tests.rs +++ b/src/env/tests.rs @@ -9,10 +9,19 @@ fn de<'de, T: serde::Deserialize<'de>>(v: &'static str) -> Result { fn boolean() { assert_eq!(de("1"), Ok(true)); assert_eq!(de("true "), Ok(true)); + assert_eq!(de(" True "), Ok(true)); assert_eq!(de(" TRUE"), Ok(true)); + assert_eq!(de("yes"), Ok(true)); + assert_eq!(de(" Yes"), Ok(true)); + assert_eq!(de("YES "), Ok(true)); + assert_eq!(de("0 "), Ok(false)); assert_eq!(de(" false"), Ok(false)); + assert_eq!(de(" False "), Ok(false)); assert_eq!(de("FALSE "), Ok(false)); + assert_eq!(de("no"), Ok(false)); + assert_eq!(de(" No"), Ok(false)); + assert_eq!(de("NO "), Ok(false)); } #[test]