-
Notifications
You must be signed in to change notification settings - Fork 0
/
feature.go
108 lines (85 loc) · 2.89 KB
/
feature.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
package eygo
import (
"encoding/json"
"fmt"
)
// Feature is a data structure that models a platform feature on the Engine
// Yard API.
type Feature struct {
ID string `json:"id,omitempty"`
Name string `json:"name,omitempty"`
Description string `json:"description,omitempty"`
}
// FeatureService is a repository one can use to retrieve, enable, and disable
// Feature records on the API.
type FeatureService struct {
Driver Driver
}
// NewFeatureService returns a FeatureService configured with the provided
// Driver.
func NewFeatureService(driver Driver) *FeatureService {
return &FeatureService{Driver: driver}
}
// All returns an array of Features that matches the given Params.
func (service *FeatureService) All(params Params) []*Feature {
return service.collection("features", params)
}
// ForAccount returns an array of Features that are both associated with the
// given Account and matching the given Params.
func (service *FeatureService) ForAccount(account *Account, params Params) []*Feature {
return service.collection("accounts/"+account.ID+"/features", params)
}
// Enable turns the given Feature on for the Account in question.
func (service *FeatureService) Enable(account *Account, feature *Feature) error {
params := Params{}
response := service.Driver.Post(
"accounts/"+account.ID+"/features/"+feature.ID,
params,
nil,
)
if !response.Okay() {
return response.Error
}
return nil
}
// Disable turns the given feature off for the Account in question.
func (service *FeatureService) Disable(account *Account, feature *Feature) error {
if feature == nil || len(feature.ID) == 0 {
return fmt.Errorf("No valid feature given")
}
if account == nil || len(account.ID) == 0 {
return fmt.Errorf("No valid account given")
}
response := service.Driver.Delete("accounts/"+account.ID+"/features/"+feature.ID, Params{})
if !response.Okay() {
return response.Error
}
return nil
}
func (service *FeatureService) collection(path string, params Params) []*Feature {
features := make([]*Feature, 0)
response := service.Driver.Get(path, params)
if response.Okay() {
for _, page := range response.Pages {
wrapper := struct {
Features []*Feature `json:"features,omitempty"`
}{}
if err := json.Unmarshal(page, &wrapper); err == nil {
features = append(features, wrapper.Features...)
}
}
}
return features
}
/*
Copyright 2018 Dennis Walters
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/