...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package internaltest
19
20 import (
21 "os"
22 )
23
24 type Env struct {
25 Name string
26 Value string
27 Exists bool
28 }
29
30
31 type EnvStore interface {
32
33 Record(key string)
34
35
36 Restore() error
37 }
38
39 var _ EnvStore = (*envStore)(nil)
40
41 type envStore struct {
42 store map[string]Env
43 }
44
45 func (s *envStore) add(env Env) {
46 s.store[env.Name] = env
47 }
48
49 func (s *envStore) Restore() error {
50 var err error
51 for _, v := range s.store {
52 if v.Exists {
53 err = os.Setenv(v.Name, v.Value)
54 } else {
55 err = os.Unsetenv(v.Name)
56 }
57 if err != nil {
58 return err
59 }
60 }
61 return nil
62 }
63
64 func (s *envStore) setEnv(key, value string) error {
65 s.Record(key)
66
67 err := os.Setenv(key, value)
68 if err != nil {
69 return err
70 }
71 return nil
72 }
73
74 func (s *envStore) Record(key string) {
75 originValue, exists := os.LookupEnv(key)
76 s.add(Env{
77 Name: key,
78 Value: originValue,
79 Exists: exists,
80 })
81 }
82
83 func NewEnvStore() EnvStore {
84 return newEnvStore()
85 }
86
87 func newEnvStore() *envStore {
88 return &envStore{store: make(map[string]Env)}
89 }
90
91 func SetEnvVariables(env map[string]string) (EnvStore, error) {
92 envStore := newEnvStore()
93
94 for k, v := range env {
95 err := envStore.setEnv(k, v)
96 if err != nil {
97 return nil, err
98 }
99 }
100 return envStore, nil
101 }
102
View as plain text