Skip to content

Commit 069f818

Browse files
committed
feat: util impls on fromenvvar and fromenv
1 parent 39d8820 commit 069f818

File tree

1 file changed

+115
-0
lines changed

1 file changed

+115
-0
lines changed

src/utils/from_env.rs

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,87 @@ pub trait FromEnv: core::fmt::Debug + Sized + 'static {
281281
fn from_env() -> Result<Self, FromEnvErr<Self::Error>>;
282282
}
283283

284+
impl<T> FromEnv for Option<T>
285+
where
286+
T: FromEnv,
287+
{
288+
type Error = T::Error;
289+
290+
fn inventory() -> Vec<&'static EnvItemInfo> {
291+
T::inventory()
292+
}
293+
294+
fn check_inventory() -> Result<(), Vec<&'static EnvItemInfo>> {
295+
T::check_inventory()
296+
}
297+
298+
fn from_env() -> Result<Self, FromEnvErr<Self::Error>> {
299+
match T::from_env() {
300+
Ok(v) => Ok(Some(v)),
301+
Err(FromEnvErr::Empty(_)) | Err(FromEnvErr::EnvError(_, _)) => Ok(None),
302+
Err(e) => Err(e),
303+
}
304+
}
305+
}
306+
307+
impl<T> FromEnv for Box<T>
308+
where
309+
T: FromEnv,
310+
{
311+
type Error = T::Error;
312+
313+
fn inventory() -> Vec<&'static EnvItemInfo> {
314+
T::inventory()
315+
}
316+
317+
fn check_inventory() -> Result<(), Vec<&'static EnvItemInfo>> {
318+
T::check_inventory()
319+
}
320+
321+
fn from_env() -> Result<Self, FromEnvErr<Self::Error>> {
322+
T::from_env().map(Box::new)
323+
}
324+
}
325+
326+
impl<T> FromEnv for std::sync::Arc<T>
327+
where
328+
T: FromEnv,
329+
{
330+
type Error = T::Error;
331+
332+
fn inventory() -> Vec<&'static EnvItemInfo> {
333+
T::inventory()
334+
}
335+
336+
fn check_inventory() -> Result<(), Vec<&'static EnvItemInfo>> {
337+
T::check_inventory()
338+
}
339+
340+
fn from_env() -> Result<Self, FromEnvErr<Self::Error>> {
341+
T::from_env().map(std::sync::Arc::new)
342+
}
343+
}
344+
345+
impl<T, U> FromEnv for std::borrow::Cow<'static, U>
346+
where
347+
T: FromEnv,
348+
U: std::borrow::ToOwned<Owned = T> + core::fmt::Debug,
349+
{
350+
type Error = T::Error;
351+
352+
fn inventory() -> Vec<&'static EnvItemInfo> {
353+
T::inventory()
354+
}
355+
356+
fn check_inventory() -> Result<(), Vec<&'static EnvItemInfo>> {
357+
T::check_inventory()
358+
}
359+
360+
fn from_env() -> Result<Self, FromEnvErr<Self::Error>> {
361+
T::from_env().map(std::borrow::Cow::Owned)
362+
}
363+
}
364+
284365
/// Trait for loading primitives from the environment. These are simple types
285366
/// that should correspond to a single environment variable. It has been
286367
/// implemented for common integer types, [`String`], [`url::Url`],
@@ -405,6 +486,40 @@ where
405486
}
406487
}
407488

489+
impl<T> FromEnvVar for Box<T>
490+
where
491+
T: FromEnvVar,
492+
{
493+
type Error = T::Error;
494+
495+
fn from_env_var(env_var: &str) -> Result<Self, FromEnvErr<Self::Error>> {
496+
T::from_env_var(env_var).map(Box::new)
497+
}
498+
}
499+
500+
impl<T> FromEnvVar for std::sync::Arc<T>
501+
where
502+
T: FromEnvVar,
503+
{
504+
type Error = T::Error;
505+
506+
fn from_env_var(env_var: &str) -> Result<Self, FromEnvErr<Self::Error>> {
507+
T::from_env_var(env_var).map(std::sync::Arc::new)
508+
}
509+
}
510+
511+
impl<T, U> FromEnvVar for std::borrow::Cow<'static, U>
512+
where
513+
T: FromEnvVar,
514+
U: std::borrow::ToOwned<Owned = T> + core::fmt::Debug,
515+
{
516+
type Error = T::Error;
517+
518+
fn from_env_var(env_var: &str) -> Result<Self, FromEnvErr<Self::Error>> {
519+
T::from_env_var(env_var).map(std::borrow::Cow::Owned)
520+
}
521+
}
522+
408523
impl FromEnvVar for String {
409524
type Error = std::convert::Infallible;
410525

0 commit comments

Comments
 (0)