forked from intelsdi-x/snap
/
body.go
144 lines (128 loc) · 4.38 KB
/
body.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
/*
http://www.apache.org/licenses/LICENSE-2.0.txt
Copyright 2015 Intel Corporation
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.
*/
package rbody
import (
"encoding/json"
"errors"
"github.com/intelsdi-x/snap/core/cdata"
)
type Body interface {
// These function names are rather verbose to avoid field vs function namespace collisions
// with varied object types that use them.
ResponseBodyMessage() string
ResponseBodyType() string
}
var (
ErrCannotUnmarshalBody = errors.New("Cannot unmarshal body: invalid type")
)
type APIResponse struct {
Meta *APIResponseMeta `json:"meta"`
Body Body `json:"body"`
JSONResponse string `json:"-"`
}
type apiResponseJSON struct {
Meta *APIResponseMeta `json:"meta"`
Body json.RawMessage `json:"body"`
}
type APIResponseMeta struct {
Code int `json:"code"`
Message string `json:"message"`
Type string `json:"type"`
Version int `json:"version"`
}
func (a *APIResponse) UnmarshalJSON(b []byte) error {
ar := &apiResponseJSON{}
err := json.Unmarshal(b, ar)
if err != nil {
panic(err)
}
if ar.Meta == nil {
return errors.New("Unable to parse JSON response")
}
body, err := UnmarshalBody(ar.Meta.Type, ar.Body)
if err != nil {
return err
}
// Assign
a.Meta = ar.Meta
a.Body = body
return nil
}
func UnmarshalBody(t string, b []byte) (Body, error) {
switch t {
case PluginListType:
return unmarshalAndHandleError(b, &PluginList{})
case PluginsLoadedType:
return unmarshalAndHandleError(b, &PluginsLoaded{})
case PluginUnloadedType:
return unmarshalAndHandleError(b, &PluginUnloaded{})
case PluginReturnedType:
return unmarshalAndHandleError(b, &PluginReturned{})
case ScheduledTaskListReturnedType:
return unmarshalAndHandleError(b, &ScheduledTaskListReturned{})
case ScheduledTaskReturnedType:
return unmarshalAndHandleError(b, &ScheduledTaskReturned{})
case ScheduledTaskType:
return unmarshalAndHandleError(b, &ScheduledTask{})
case AddScheduledTaskType:
return unmarshalAndHandleError(b, &AddScheduledTask{})
case ScheduledTaskStartedType:
return unmarshalAndHandleError(b, &ScheduledTaskStarted{})
case ScheduledTaskStoppedType:
return unmarshalAndHandleError(b, &ScheduledTaskStopped{})
case ScheduledTaskRemovedType:
return unmarshalAndHandleError(b, &ScheduledTaskRemoved{})
case ScheduledTaskEnabledType:
return unmarshalAndHandleError(b, &ScheduledTaskEnabled{})
case MetricReturnedType:
return unmarshalAndHandleError(b, &MetricReturned{})
case MetricsReturnedType:
return unmarshalAndHandleError(b, &MetricsReturned{})
case ScheduledTaskWatchingEndedType:
return unmarshalAndHandleError(b, &ScheduledTaskWatchingEnded{})
case TribeMemberListType:
return unmarshalAndHandleError(b, &TribeMemberList{})
case TribeListAgreementType:
return unmarshalAndHandleError(b, &TribeListAgreement{})
case TribeAddAgreementType:
return unmarshalAndHandleError(b, &TribeAddAgreement{})
case TribeDeleteAgreementType:
return unmarshalAndHandleError(b, &TribeDeleteAgreement{})
case TribeMemberShowType:
return unmarshalAndHandleError(b, &TribeMemberShow{})
case TribeJoinAgreementType:
return unmarshalAndHandleError(b, &TribeJoinAgreement{})
case TribeLeaveAgreementType:
return unmarshalAndHandleError(b, &TribeLeaveAgreement{})
case TribeGetAgreementType:
return unmarshalAndHandleError(b, &TribeGetAgreement{})
case PluginConfigItemType:
return unmarshalAndHandleError(b, &PluginConfigItem{*cdata.NewNode()})
case SetPluginConfigItemType:
return unmarshalAndHandleError(b, &SetPluginConfigItem{*cdata.NewNode()})
case DeletePluginConfigItemType:
return unmarshalAndHandleError(b, &DeletePluginConfigItem{*cdata.NewNode()})
case ErrorType:
return unmarshalAndHandleError(b, &Error{})
default:
return nil, ErrCannotUnmarshalBody
}
}
func unmarshalAndHandleError(b []byte, body Body) (Body, error) {
err := json.Unmarshal(b, body)
if err != nil {
return nil, err
}
return body, nil
}