Skip to content

Commit

Permalink
feat: Add support of new types (#67)
Browse files Browse the repository at this point in the history
* feat: Add support of int16

* feat: Add support of []int16

* chore: Add tests

* fix: Bitsize type int16

* feat: Add support of []time.Time
  • Loading branch information
obalunenko committed Mar 25, 2023
1 parent 463dd31 commit f6f6fa5
Show file tree
Hide file tree
Showing 7 changed files with 828 additions and 4 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ Types supported:
- []int
- int8
- []int8
- int16
- []int16
- int32
- []int32
- int64
Expand All @@ -31,6 +33,7 @@ Types supported:
- float64
- []float64
- time.Time
- []time.Time
- time.Duration
- bool
```
Expand Down
280 changes: 280 additions & 0 deletions getenv_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1115,6 +1115,97 @@ func TestTimeOrDefault(t *testing.T) {
}
}

func TestTimeSliceOrDefault(t *testing.T) {
const layout = "2006/02/01 15:04"

type args struct {
key string
defaultVal []time.Time
layout string
separator string
}

type expected struct {
val []time.Time
}

var tests = []struct {
name string
precond precondition
args args
expected expected
}{
{
name: "env not set - default returned",
precond: precondition{
setenv: setenv{
isSet: false,
val: "2018/21/04 22:30,2023/21/04 22:30",
},
},
args: args{
key: testEnvKey,
defaultVal: []time.Time{time.Date(2021, 04, 21, 22, 30, 0, 0, time.UTC)},
layout: layout,
separator: ",",
},
expected: expected{
val: []time.Time{
time.Date(2021, 04, 21, 22, 30, 0, 0, time.UTC),
},
},
},
{
name: "env set - env value returned",
precond: precondition{
setenv: setenv{
isSet: true,
val: "2018/21/04 22:30,2023/21/04 22:30",
},
},
args: args{
key: testEnvKey,
defaultVal: []time.Time{time.Date(2021, 04, 21, 22, 30, 0, 0, time.UTC)},
layout: layout,
separator: ",",
},
expected: expected{
val: []time.Time{
time.Date(2018, 04, 21, 22, 30, 0, 0, time.UTC),
time.Date(2023, 04, 21, 22, 30, 0, 0, time.UTC),
},
},
},
{
name: "empty env value set - default returned",
precond: precondition{
setenv: setenv{
isSet: true,
val: "",
},
},
args: args{
key: testEnvKey,
defaultVal: []time.Time{time.Date(2021, 04, 21, 22, 30, 0, 0, time.UTC)},
layout: layout,
separator: ",",
},
expected: expected{
val: []time.Time{time.Date(2021, 04, 21, 22, 30, 0, 0, time.UTC)},
},
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
tt.precond.maybeSetEnv(t, tt.args.key)

got := getenv.EnvOrDefault(tt.args.key, tt.args.defaultVal, option.WithTimeLayout(tt.args.layout), option.WithSeparator(","))
assert.Equal(t, tt.expected.val, got)
})
}
}

func TestDurationOrDefault(t *testing.T) {
type args struct {
key string
Expand Down Expand Up @@ -1946,3 +2037,192 @@ func TestUint32OrDefault(t *testing.T) {
})
}
}

func TestInt16OrDefault(t *testing.T) {
type args struct {
key string
defaultVal int16
}

type expected struct {
val int16
}

var tests = []struct {
name string
precond precondition
args args
expected expected
}{
{
name: "env not set - default returned",
precond: precondition{
setenv: setenv{
isSet: false,
val: "12",
},
},
args: args{
key: testEnvKey,
defaultVal: 999,
},
expected: expected{
val: 999,
},
},
{
name: "env set - env value returned",
precond: precondition{
setenv: setenv{
isSet: true,
val: "12",
},
},
args: args{
key: testEnvKey,
defaultVal: 999,
},
expected: expected{
val: 12,
},
},
{
name: "empty env value set - default returned",
precond: precondition{
setenv: setenv{
isSet: true,
val: "",
},
},
args: args{
key: testEnvKey,
defaultVal: 999,
},
expected: expected{
val: 999,
},
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
tt.precond.maybeSetEnv(t, tt.args.key)

got := getenv.EnvOrDefault(tt.args.key, tt.args.defaultVal)
assert.Equal(t, tt.expected.val, got)
})
}
}

func TestInt16SliceOrDefault(t *testing.T) {
type args struct {
key string
defaultVal []int16
sep string
}

type expected struct {
val []int16
}

var tests = []struct {
name string
precond precondition
args args
expected expected
}{
{
name: "env not set - default returned",
precond: precondition{
setenv: setenv{
isSet: false,
val: "1,27",
},
},
args: args{
key: testEnvKey,
defaultVal: []int16{99},
sep: ",",
},
expected: expected{
val: []int16{99},
},
},
{
name: "env set - env value returned",
precond: precondition{
setenv: setenv{
isSet: true,
val: "1,2",
},
},
args: args{
key: testEnvKey,
defaultVal: []int16{99},
sep: ",",
},
expected: expected{
val: []int16{1, 2},
},
},
{
name: "env set, no separator - default value returned",
precond: precondition{
setenv: setenv{
isSet: true,
val: "1,2",
},
},
args: args{
key: testEnvKey,
defaultVal: []int16{99},
sep: "",
},
expected: expected{
val: []int16{99},
},
},
{
name: "env set, wrong separator - default value returned",
precond: precondition{
setenv: setenv{
isSet: true,
val: "1,2",
},
},
args: args{
key: testEnvKey,
defaultVal: []int16{99},
sep: "|",
},
expected: expected{
val: []int16{99},
},
},
{
name: "empty env value set - default returned",
precond: precondition{
setenv: setenv{
isSet: true,
val: "",
},
},
args: args{
key: testEnvKey,
defaultVal: []int16{99},
},
expected: expected{
val: []int16{99},
},
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
tt.precond.maybeSetEnv(t, tt.args.key)

got := getenv.EnvOrDefault(tt.args.key, tt.args.defaultVal, option.WithSeparator(tt.args.sep))
assert.Equal(t, tt.expected.val, got)
})
}
}
11 changes: 8 additions & 3 deletions internal/constraint.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
type (
// EnvParsable is a constraint for supported environment variable types parsers.
EnvParsable interface {
String | Int | Float | Time | bool
String | Int | Uint | Float | Time | bool
}

// String is a constraint for strings and slice of strings.
Expand All @@ -17,7 +17,12 @@ type (

// Int is a constraint for integer and slice of integers.
Int interface {
int | []int | int8 | []int8 | int32 | []int32 | int64 | []int64 | uint64 | []uint64 | uint | []uint | []uint32 | uint32
int | []int | int8 | []int8 | int16 | []int16 | int32 | []int32 | int64 | []int64
}

// Uint is a constraint for unsigned integer and slice of unsigned integers.
Uint interface {
uint64 | []uint64 | uint | []uint | []uint32 | uint32
}

// Float is a constraint for floats and slice of floats.
Expand All @@ -27,6 +32,6 @@ type (

// Time is a constraint for time.Time and time.Duration.
Time interface {
time.Time | time.Duration
time.Time | []time.Time | time.Duration
}
)
Loading

0 comments on commit f6f6fa5

Please sign in to comment.