1// Copyright 2017 Oliver Eilhard. All rights reserved.
2// Use of this source code is governed by a MIT-license.
3// See http://olivere.mit-license.org/license.txt for details.
4
5package env
6
7import (
8	"os"
9	"strconv"
10	"time"
11)
12
13type envGetter func(string) string
14
15// getter allows mocking os.Getenv in tests.
16var getter envGetter = os.Getenv
17
18// String inspects the environment variables specified in envvars.
19// If all of these environment variables are empty, it returns defaultValue.
20func String(defaultValue string, envvars ...string) string {
21	for _, envvar := range envvars {
22		if s := getter(envvar); s != "" {
23			return s
24		}
25	}
26	return defaultValue
27}
28
29// Int inspects the environment variables specified in envvars.
30// If all of these environment variables are empty, it returns defaultValue.
31func Int(defaultValue int, envvars ...string) int {
32	for _, envvar := range envvars {
33		if s := getter(envvar); s != "" {
34			if i, err := strconv.Atoi(s); err == nil {
35				return i
36			}
37		}
38	}
39	return defaultValue
40}
41
42// Int64 inspects the environment variables specified in envvars.
43// If all of these environment variables are empty, it returns defaultValue.
44func Int64(defaultValue int64, envvars ...string) int64 {
45	for _, envvar := range envvars {
46		if s := getter(envvar); s != "" {
47			if i, err := strconv.ParseInt(s, 10, 64); err == nil {
48				return i
49			}
50		}
51	}
52	return defaultValue
53}
54
55// Float32 inspects the environment variables specified in envvars.
56// If all of these environment variables are empty, it returns defaultValue.
57func Float32(defaultValue float32, envvars ...string) float32 {
58	for _, envvar := range envvars {
59		if s := getter(envvar); s != "" {
60			if f, err := strconv.ParseFloat(s, 32); err == nil {
61				return float32(f)
62			}
63		}
64	}
65	return defaultValue
66}
67
68// Float64 inspects the environment variables specified in envvars.
69// If all of these environment variables are empty, it returns defaultValue.
70func Float64(defaultValue float64, envvars ...string) float64 {
71	for _, envvar := range envvars {
72		if s := getter(envvar); s != "" {
73			if f, err := strconv.ParseFloat(s, 64); err == nil {
74				return f
75			}
76		}
77	}
78	return defaultValue
79}
80
81// Bool inspects the environment variables specified in envvars.
82// If all of these environment variables are empty, it returns defaultValue.
83func Bool(defaultValue bool, envvars ...string) bool {
84	for _, envvar := range envvars {
85		if s := getter(envvar); s != "" {
86			if flag, err := strconv.ParseBool(s); err == nil {
87				return flag
88			}
89		}
90	}
91	return defaultValue
92}
93
94// Time inspects the environment variables specified in envvars.
95// If all of these environment variables are empty, it returns defaultValue.
96func Time(defaultValue time.Time, layout string, envvars ...string) time.Time {
97	for _, envvar := range envvars {
98		if s := getter(envvar); s != "" {
99			if d, err := time.Parse(layout, s); err == nil {
100				return d
101			}
102		}
103	}
104	return defaultValue
105}
106
107// Duration inspects the environment variables specified in envvars.
108// If all of these environment variables are empty, it returns defaultValue.
109func Duration(defaultValue time.Duration, envvars ...string) time.Duration {
110	for _, envvar := range envvars {
111		if s := getter(envvar); s != "" {
112			if d, err := time.ParseDuration(s); err == nil {
113				return d
114			}
115		}
116	}
117	return defaultValue
118}
119