forked from mbrt/gmailctl
-
Notifications
You must be signed in to change notification settings - Fork 0
/
import.go
128 lines (109 loc) · 2.79 KB
/
import.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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package v1alpha3
import (
"fmt"
"github.com/hashicorp/go-multierror"
"github.com/mbrt/gmailctl/cmd/gmailctl-config-migrate/v1alpha2"
"github.com/mbrt/gmailctl/internal/engine/config/v1alpha3"
)
var dummyFilter = v1alpha3.FilterNode{}
// Import converts a v2 config into a v3.
func Import(cfg v1alpha2.Config) (v1alpha3.Config, error) {
i := importer{}
return i.Import(cfg)
}
type importer struct {
nmap namedFilterMap
err error
}
func (i *importer) Import(cfg v1alpha2.Config) (v1alpha3.Config, error) {
i.importNamedFilters(cfg.Filters)
finalErr := i.resetError()
var rules []v1alpha3.Rule
for _, r := range cfg.Rules {
rules = append(rules, i.importRule(r))
if err := i.resetError(); err != nil {
finalErr = multierror.Append(finalErr,
fmt.Errorf("in rule %s: %w", r, err),
)
}
}
return v1alpha3.Config{
Version: v1alpha3.Version,
Author: v1alpha3.Author{
Name: cfg.Author.Name,
Email: cfg.Author.Email,
},
Rules: rules,
}, finalErr
}
func (i *importer) importNamedFilters(fs []v1alpha2.NamedFilter) {
i.nmap = namedFilterMap{}
var finalErr error
for _, f := range fs {
i.nmap[f.Name] = i.importFilter(f.Query)
if err := i.resetError(); err != nil {
finalErr = multierror.Append(finalErr,
fmt.Errorf("in filter '%s' %s: %w", f.Name, f.Query, err),
)
}
}
i.err = finalErr
}
func (i *importer) importRule(r v1alpha2.Rule) v1alpha3.Rule {
return v1alpha3.Rule{
Filter: i.importFilter(r.Filter),
Actions: v1alpha3.Actions{
Archive: r.Actions.Archive,
Delete: r.Actions.Delete,
MarkRead: r.Actions.MarkRead,
Star: r.Actions.Star,
MarkSpam: r.Actions.MarkSpam,
MarkImportant: r.Actions.MarkImportant,
Category: r.Actions.Category,
Labels: r.Actions.Labels,
},
}
}
func (i *importer) importFilter(f v1alpha2.FilterNode) v1alpha3.FilterNode {
if f.RefName != "" {
return i.importRefName(f.RefName)
}
var not *v1alpha3.FilterNode
if f.Not != nil {
nf := i.importFilter(*f.Not)
not = &nf
}
return v1alpha3.FilterNode{
And: i.importFilters(f.And),
Or: i.importFilters(f.Or),
Not: not,
From: f.From,
To: f.To,
Cc: f.Cc,
Subject: f.Subject,
List: f.List,
Has: f.Has,
Query: f.Query,
}
}
func (i *importer) importFilters(ns []v1alpha2.FilterNode) []v1alpha3.FilterNode {
var res []v1alpha3.FilterNode
for _, f := range ns {
res = append(res, i.importFilter(f))
}
return res
}
func (i *importer) importRefName(name string) v1alpha3.FilterNode {
if n, ok := i.nmap[name]; ok {
return n
}
i.err = multierror.Append(i.err,
fmt.Errorf("filter name '%s' not found", name))
return dummyFilter
}
func (i *importer) resetError() error {
err := i.err
i.err = nil
return err
}
type namedFilterMap map[string]v1alpha3.FilterNode