-
Notifications
You must be signed in to change notification settings - Fork 4.5k
/
feature_structs.go
148 lines (126 loc) · 3.57 KB
/
feature_structs.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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package appconfiguration
import (
"encoding/json"
"fmt"
"strings"
"github.com/mitchellh/mapstructure"
)
const (
TargetingFilterName = "Microsoft.Targeting"
TimewindowFilterName = "Microsoft.TimeWindow"
PercentageFilterName = "Microsoft.Percentage"
)
type ClientFilter struct {
Filters []interface{}
}
func (p *ClientFilter) UnmarshalJSON(b []byte) error {
var tempIntf []interface{}
if err := json.Unmarshal(b, &tempIntf); err != nil {
return err
}
filtersOut := make([]interface{}, 0)
for _, filterRawIntf := range tempIntf {
filterRaw, ok := filterRawIntf.(map[string]interface{})
if !ok {
return fmt.Errorf("wtf")
}
nameRaw, ok := filterRaw["name"]
if !ok {
return fmt.Errorf("missing name ...")
}
name := nameRaw.(string)
switch strings.ToLower(name) {
case "microsoft.targeting":
{
var out TargetingFeatureFilter
mpc := mapstructure.DecoderConfig{TagName: "json", Result: &out}
mpd, err := mapstructure.NewDecoder(&mpc)
if err != nil {
return err
}
err = mpd.Decode(filterRaw)
if err != nil {
return err
}
filtersOut = append(filtersOut, out)
}
case "microsoft.timewindow":
{
var out TimewindowFeatureFilter
mpc := mapstructure.DecoderConfig{TagName: "json", Result: &out}
mpd, err := mapstructure.NewDecoder(&mpc)
if err != nil {
return err
}
err = mpd.Decode(filterRaw)
if err != nil {
return err
}
filtersOut = append(filtersOut, out)
}
case "microsoft.percentage":
{
var out PercentageFeatureFilter
mpc := mapstructure.DecoderConfig{TagName: "json", Result: &out}
mpd, err := mapstructure.NewDecoder(&mpc)
if err != nil {
return err
}
err = mpd.Decode(filterRaw)
if err != nil {
return err
}
filtersOut = append(filtersOut, out)
}
default:
return fmt.Errorf("unknown type %q", name)
}
}
p.Filters = filtersOut
return nil
}
func (p ClientFilter) MarshalJSON() ([]byte, error) {
return json.Marshal(p.Filters)
}
type PercentageFilterParameters struct {
Value float64 `json:"Value"`
}
type PercentageFeatureFilter struct {
Name string `json:"name"`
Parameters PercentageFilterParameters `json:"parameters"`
}
type TargetingGroupParameter struct {
Name string `json:"Name" tfschema:"name"`
RolloutPercentage int `json:"RolloutPercentage" tfschema:"rollout_percentage"`
}
type TargetingFilterParameters struct {
Audience TargetingFilterAudience `json:"Audience"`
}
type TargetingFilterAudience struct {
DefaultRolloutPercentage int `json:"DefaultRolloutPercentage" tfschema:"default_rollout_percentage"`
Users []string `json:"Users" tfschema:"users"`
Groups []TargetingGroupParameter `json:"Groups" tfschema:"groups"`
}
type TargetingFeatureFilter struct {
Name string `json:"name"`
Parameters TargetingFilterParameters `json:"parameters"`
}
type TimewindowFilterParameters struct {
Start string `json:"Start" tfschema:"start"`
End string `json:"End" tfschema:"end"`
}
type TimewindowFeatureFilter struct {
Name string `json:"name"`
Parameters TimewindowFilterParameters `json:"parameters"`
}
type Conditions struct {
ClientFilters ClientFilter `json:"client_filters"`
}
type FeatureValue struct {
ID string `json:"id"`
Description string `json:"description"`
Enabled bool `json:"enabled"`
Conditions Conditions `json:"conditions"`
}