Skip to content

Commit 19de57d

Browse files
committedAug 7, 2024··
docs: more examples
1 parent d7efb64 commit 19de57d

File tree

2 files changed

+143
-64
lines changed

2 files changed

+143
-64
lines changed
 

‎env_examples_test.go

+143
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
package env
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"os"
7+
)
8+
9+
func ExampleParse() {
10+
type Config struct {
11+
Home string `env:"HOME"`
12+
}
13+
os.Setenv("HOME", "/tmp/fakehome")
14+
var cfg Config
15+
if err := Parse(&cfg); err != nil {
16+
log.Fatal(err)
17+
}
18+
fmt.Printf("%+v", cfg)
19+
// Output: {Home:/tmp/fakehome}
20+
}
21+
22+
func ExampleParseAs() {
23+
type Config struct {
24+
Home string `env:"HOME"`
25+
}
26+
os.Setenv("HOME", "/tmp/fakehome")
27+
cfg, err := ParseAs[Config]()
28+
if err != nil {
29+
log.Fatal(err)
30+
}
31+
fmt.Printf("%+v", cfg)
32+
// Output: {Home:/tmp/fakehome}
33+
}
34+
35+
func ExampleParse_required() {
36+
type Config struct {
37+
Nope string `env:"NOPE,required"`
38+
}
39+
var cfg Config
40+
if err := Parse(&cfg); err != nil {
41+
log.Fatal(err)
42+
}
43+
fmt.Printf("%+v", cfg)
44+
// Output: env: required environment variable "NOPE" is not set
45+
// {Nope:}
46+
}
47+
48+
func ExampleParse_notEmpty() {
49+
type Config struct {
50+
Nope string `env:"NOPE,notEmpty"`
51+
}
52+
os.Setenv("NOPE", "")
53+
var cfg Config
54+
if err := Parse(&cfg); err != nil {
55+
log.Fatal(err)
56+
}
57+
fmt.Printf("%+v", cfg)
58+
// Output: env: environment variable "NOPE" should not be empty
59+
// {Nope:}
60+
}
61+
62+
func ExampleParse_unset() {
63+
type Config struct {
64+
Secret string `env:"SECRET,unset"`
65+
}
66+
os.Setenv("SECRET", "1234")
67+
var cfg Config
68+
if err := Parse(&cfg); err != nil {
69+
log.Fatal(err)
70+
}
71+
fmt.Printf("%+v - %s", cfg, os.Getenv("SECRET"))
72+
// Output: {Secret:1234} -
73+
}
74+
75+
func ExampleParse_expand() {
76+
type Config struct {
77+
Expand1 string `env:"EXPAND_1,expand"`
78+
Expand2 string `env:"EXPAND_2,expand" envDefault:"ABC_${EXPAND_1}"`
79+
}
80+
os.Setenv("EXPANDING", "HI")
81+
os.Setenv("EXPAND_1", "HELLO_${EXPANDING}")
82+
var cfg Config
83+
if err := Parse(&cfg); err != nil {
84+
log.Fatal(err)
85+
}
86+
fmt.Printf("%+v", cfg)
87+
// Output: {Expand1:HELLO_HI Expand2:ABC_HELLO_HI}
88+
}
89+
90+
func ExampleParse_init() {
91+
type Inner struct {
92+
A string `env:"OLA" envDefault:"HI"`
93+
}
94+
type Config struct {
95+
NilInner *Inner
96+
InitInner *Inner `env:",init"`
97+
}
98+
var cfg Config
99+
if err := Parse(&cfg); err != nil {
100+
log.Fatal(err)
101+
}
102+
fmt.Print(cfg.NilInner, cfg.InitInner)
103+
// Output: <nil> &{HI}
104+
}
105+
106+
func ExampleParse_setDefaults() {
107+
type Config struct {
108+
Foo string `env:"FOO"`
109+
Bar string `env:"BAR" envDefault:"bar"`
110+
}
111+
cfg := Config{
112+
Foo: "foo",
113+
}
114+
if err := Parse(&cfg); err != nil {
115+
fmt.Println(err)
116+
}
117+
fmt.Printf("%+v", cfg)
118+
// Output: {Foo:foo Bar:bar}
119+
}
120+
121+
func ExampleParse_onSet() {
122+
type config struct {
123+
Home string `env:"HOME,required"`
124+
Port int `env:"PORT" envDefault:"3000"`
125+
IsProduction bool `env:"PRODUCTION"`
126+
NoEnvTag bool
127+
Inner struct{} `envPrefix:"INNER_"`
128+
}
129+
os.Setenv("HOME", "/tmp/fakehome")
130+
var cfg config
131+
if err := ParseWithOptions(&cfg, Options{
132+
OnSet: func(tag string, value interface{}, isDefault bool) {
133+
fmt.Printf("Set %s to %v (default? %v)\n", tag, value, isDefault)
134+
},
135+
}); err != nil {
136+
fmt.Println("failed:", err)
137+
}
138+
fmt.Printf("%+v", cfg)
139+
// Output: Set HOME to /tmp/fakehome (default? false)
140+
// Set PORT to 3000 (default? true)
141+
// Set PRODUCTION to (default? false)
142+
// {Home:/tmp/fakehome Port:3000 IsProduction:false NoEnvTag:false Inner:{}}
143+
}

‎env_test.go

-64
Original file line numberDiff line numberDiff line change
@@ -1354,70 +1354,6 @@ func TestParseInvalidURL(t *testing.T) {
13541354
isTrue(t, errors.Is(err, ParseError{}))
13551355
}
13561356

1357-
func ExampleParse() {
1358-
type inner struct {
1359-
Foo string `env:"FOO" envDefault:"foobar"`
1360-
}
1361-
type config struct {
1362-
Home string `env:"HOME,required"`
1363-
Port int `env:"PORT" envDefault:"3000"`
1364-
IsProduction bool `env:"PRODUCTION"`
1365-
TempFolder string `env:"TEMP_FOLDER,expand" envDefault:"${HOME}/.tmp"`
1366-
StringInts map[string]int `env:"MAP_STRING_INT" envDefault:"k1:1,k2:2"`
1367-
Inner inner
1368-
}
1369-
os.Setenv("HOME", "/tmp/fakehome")
1370-
var cfg config
1371-
if err := Parse(&cfg); err != nil {
1372-
fmt.Println("failed:", err)
1373-
}
1374-
fmt.Printf("%+v", cfg)
1375-
// Output: {Home:/tmp/fakehome Port:3000 IsProduction:false TempFolder:/tmp/fakehome/.tmp StringInts:map[k1:1 k2:2] Inner:{Foo:foobar}}
1376-
}
1377-
1378-
func ExampleParse_onSet() {
1379-
type config struct {
1380-
Home string `env:"HOME,required"`
1381-
Port int `env:"PORT" envDefault:"3000"`
1382-
IsProduction bool `env:"PRODUCTION"`
1383-
NoEnvTag bool
1384-
Inner struct{} `envPrefix:"INNER_"`
1385-
}
1386-
os.Setenv("HOME", "/tmp/fakehome")
1387-
var cfg config
1388-
if err := ParseWithOptions(&cfg, Options{
1389-
OnSet: func(tag string, value interface{}, isDefault bool) {
1390-
fmt.Printf("Set %s to %v (default? %v)\n", tag, value, isDefault)
1391-
},
1392-
}); err != nil {
1393-
fmt.Println("failed:", err)
1394-
}
1395-
fmt.Printf("%+v", cfg)
1396-
// Output: Set HOME to /tmp/fakehome (default? false)
1397-
// Set PORT to 3000 (default? true)
1398-
// Set PRODUCTION to (default? false)
1399-
// {Home:/tmp/fakehome Port:3000 IsProduction:false NoEnvTag:false Inner:{}}
1400-
}
1401-
1402-
func ExampleParse_defaults() {
1403-
type config struct {
1404-
A string `env:"FOO" envDefault:"foo"`
1405-
B string `env:"FOO"`
1406-
}
1407-
1408-
// env FOO is not set
1409-
1410-
cfg := config{
1411-
A: "A",
1412-
B: "B",
1413-
}
1414-
if err := Parse(&cfg); err != nil {
1415-
fmt.Println("failed:", err)
1416-
}
1417-
fmt.Printf("%+v", cfg)
1418-
// Output: {A:foo B:B}
1419-
}
1420-
14211357
func TestIgnoresUnexported(t *testing.T) {
14221358
type unexportedConfig struct {
14231359
home string `env:"HOME"`

0 commit comments

Comments
 (0)
Please sign in to comment.