/
chain.go
46 lines (39 loc) · 1.07 KB
/
chain.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
package validation
import (
"context"
"errors"
"fmt"
)
// ChainedTranslator calls all translators until error passing translated module to next translator
type ChainedTranslator struct {
Translators []Translator
}
func (ct *ChainedTranslator) Translate(ctx context.Context, m Module) (translated Module, err error) {
for _, translator := range ct.Translators {
var err error
m, err = translator.Translate(ctx, m)
if err != nil {
return m, err
}
}
return m, nil
}
// ChainedLicenseResolver calls all resolvers until success
// If no success calls happened it returns ErrUnknownLicense
type ChainedLicenseResolver struct {
LicenseResolvers []LicenseResolver
}
func (crl *ChainedLicenseResolver) ResolveLicense(ctx context.Context, m Module) (License, error) {
for _, resolver := range crl.LicenseResolvers {
lic, err := resolver.ResolveLicense(ctx, m)
switch {
case errors.Is(err, nil):
return lic, nil
case errors.Is(err, ErrUnknownLicense):
continue
default:
return License{}, fmt.Errorf("%w", err)
}
}
return License{}, ErrUnknownLicense
}