• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mendersoftware / mender-server / 1920843497

11 Jul 2025 11:00AM UTC coverage: 65.508% (+0.03%) from 65.48%
1920843497

push

gitlab-ci

web-flow
Merge pull request #782 from alfrunes/MEN-7743

MEN-7743: Distributed authentication rate limits (common parts)

186 of 312 new or added lines in 6 files covered. (59.62%)

3 existing lines in 2 files now uncovered.

32347 of 49379 relevant lines covered (65.51%)

1.38 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

89.13
/backend/pkg/config/unmarshal.go
1
// Copyright 2025 Northern.tech AS
2
//
3
//        Licensed under the Apache License, Version 2.0 (the "License");
4
//        you may not use this file except in compliance with the License.
5
//        You may obtain a copy of the License at
6
//
7
//            http://www.apache.org/licenses/LICENSE-2.0
8
//
9
//        Unless required by applicable law or agreed to in writing, software
10
//        distributed under the License is distributed on an "AS IS" BASIS,
11
//        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
//        See the License for the specific language governing permissions and
13
//        limitations under the License.
14

15
package config
16

17
import (
18
        "encoding/json"
19
        "fmt"
20
        "io"
21
        "strings"
22
        "time"
23

24
        "github.com/go-viper/mapstructure/v2"
25
        "github.com/pkg/errors"
26
)
27

28
type Duration time.Duration
29

30
func (duration *Duration) UnmarshalText(b []byte) error {
1✔
31
        d, err := time.ParseDuration(string(b))
1✔
32
        if err != nil {
1✔
NEW
33
                return err
×
NEW
34
        }
×
35
        *duration = Duration(d)
1✔
36
        return nil
1✔
37
}
38

39
// UnmarshalSliceSetting will unmarshal an array of objects into the result T
40
// using either newline separated json objects for strings (from env) or
41
// an array of objects (using json struct tag) for any configuration source
42
// that is able to express a slice of objects.
43
func UnmarshalSliceSetting[T any](c Reader, path string, result *[]T) error {
1✔
44
        if result == nil {
2✔
45
                return errors.New("cannot unmarshal setting to nil result")
1✔
46
        }
1✔
47
        value := c.Get(path)
1✔
48
        var err error
1✔
49
        switch cfg := value.(type) {
1✔
50
        case string:
1✔
51
                decoder := json.NewDecoder(strings.NewReader(cfg))
1✔
52
                for {
2✔
53
                        var elem T
1✔
54
                        err = decoder.Decode(&elem)
1✔
55
                        if err != nil {
2✔
56
                                break
1✔
57
                        }
58
                        *result = append(*result, elem)
1✔
59
                }
60
                if errors.Is(err, io.EOF) {
2✔
61
                        err = nil
1✔
62
                }
1✔
63
        case []any:
1✔
64
                var decoder *mapstructure.Decoder
1✔
65
                decoder, err = mapstructure.NewDecoder(
1✔
66
                        &mapstructure.DecoderConfig{
1✔
67
                                TagName: "json",
1✔
68
                                Result:  &result,
1✔
69
                                Squash:  true,
1✔
70
                                DecodeHook: mapstructure.ComposeDecodeHookFunc(
1✔
71
                                        mapstructure.TextUnmarshallerHookFunc(),
1✔
72
                                        mapstructure.StringToTimeDurationHookFunc(),
1✔
73
                                ),
1✔
74
                        },
1✔
75
                )
1✔
76
                if err != nil {
1✔
NEW
77
                        return err
×
NEW
78
                }
×
79
                err = decoder.Decode(value)
1✔
NEW
80
        case nil:
×
81
                // pass (empty config)
82
        default:
1✔
83
                err = fmt.Errorf("invalid config type %T", cfg)
1✔
84
        }
85
        return err
1✔
86
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc