talos
56 строк · 1.4 Кб
1// This Source Code Form is subject to the terms of the Mozilla Public
2// License, v. 2.0. If a copy of the MPL was not distributed with this
3// file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
5package argsbuilder
6
7// MergePolicy defines args builder args merging policy.
8type MergePolicy int
9
10const (
11// MergeOverwrite overwrite arg when merging.
12MergeOverwrite = iota
13// MergeAdditive concat argument lists.
14MergeAdditive
15// MergeDenied fail merge if another object has the arg defined.
16MergeDenied
17)
18
19// MergePolicies merge policy map.
20type MergePolicies map[string]MergePolicy
21
22// MergeOptions provides optional arguments for merge.
23type MergeOptions struct {
24Policies MergePolicies
25}
26
27// MergeOption optional merge argument setter.
28type MergeOption func(*MergeOptions)
29
30// WithMergePolicies set merge policies during merge.
31func WithMergePolicies(policies MergePolicies) MergeOption {
32return func(o *MergeOptions) {
33o.Policies = policies
34}
35}
36
37// WithDenyList disable merge for all keys in map.
38func WithDenyList(denyList Args) MergeOption {
39return func(o *MergeOptions) {
40if o.Policies == nil {
41o.Policies = MergePolicies{}
42}
43
44for k := range denyList {
45o.Policies[k] = MergeDenied
46}
47}
48}
49
50// ArgsBuilder defines the requirements to build and manage a set of args.
51type ArgsBuilder interface {
52MustMerge(Args, ...MergeOption)
53Merge(Args, ...MergeOption) error
54Set(string, string) ArgsBuilder
55Args() []string
56}
57