-
Notifications
You must be signed in to change notification settings - Fork 110
/
settings.go
86 lines (72 loc) · 1.64 KB
/
settings.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// Copyright 2021 ChainSafe Systems (ON)
// SPDX-License-Identifier: LGPL-3.0-only
package log
import (
"io"
"os"
)
type settings struct {
writer io.Writer
level *Level
format *Format
caller callerSettings
context []contextKeyValues
}
type contextKeyValues struct {
key string
values []string
}
// newSettings returns settings using the options given.
func newSettings(options []Option) (settings settings) {
for _, option := range options {
option(&settings)
}
return settings
}
func (s *settings) setDefaults() {
if s.writer == nil {
s.writer = os.Stdout
}
if s.level == nil {
value := Info
s.level = &value
}
if s.format == nil {
value := FormatConsole
s.format = &value
}
s.caller.setDefaults()
}
// mergeWith sets values to s for all values that are set in other.
// It also merges contexts together without overriding existing keys.
func (s *settings) mergeWith(other settings) {
if other.writer != nil { // use other's writer
s.writer = other.writer
}
if other.level != nil {
value := *other.level
s.level = &value
}
if other.format != nil {
value := *other.format
s.format = &value
}
s.caller.mergeWith(other.caller)
existingKeyToIndex := make(map[string]int, len(s.context))
for i, kvs := range s.context {
existingKeyToIndex[kvs.key] = i
}
for _, kvs := range other.context {
i, ok := existingKeyToIndex[kvs.key]
if ok {
s.context[i].values = append(s.context[i].values, kvs.values...)
continue
}
kvsCopy := contextKeyValues{
key: kvs.key,
values: make([]string, len(kvs.values)),
}
copy(kvsCopy.values, kvs.values)
s.context = append(s.context, kvsCopy)
}
}