1 package objx
2
3
6
7
8
9 func (v *Value) MSI(optionalDefault ...map[string]interface{}) map[string]interface{} {
10 if s, ok := v.data.(map[string]interface{}); ok {
11 return s
12 }
13 if s, ok := v.data.(Map); ok {
14 return map[string]interface{}(s)
15 }
16 if len(optionalDefault) == 1 {
17 return optionalDefault[0]
18 }
19 return nil
20 }
21
22
23
24
25 func (v *Value) MustMSI() map[string]interface{} {
26 if s, ok := v.data.(Map); ok {
27 return map[string]interface{}(s)
28 }
29 return v.data.(map[string]interface{})
30 }
31
32
33
34 func (v *Value) MSISlice(optionalDefault ...[]map[string]interface{}) []map[string]interface{} {
35 if s, ok := v.data.([]map[string]interface{}); ok {
36 return s
37 }
38
39 s := v.ObjxMapSlice()
40 if s == nil {
41 if len(optionalDefault) == 1 {
42 return optionalDefault[0]
43 }
44 return nil
45 }
46
47 result := make([]map[string]interface{}, len(s))
48 for i := range s {
49 result[i] = s[i].Value().MSI()
50 }
51 return result
52 }
53
54
55
56
57 func (v *Value) MustMSISlice() []map[string]interface{} {
58 if s := v.MSISlice(); s != nil {
59 return s
60 }
61
62 return v.data.([]map[string]interface{})
63 }
64
65
66 func (v *Value) IsMSI() bool {
67 _, ok := v.data.(map[string]interface{})
68 if !ok {
69 _, ok = v.data.(Map)
70 }
71 return ok
72 }
73
74
75 func (v *Value) IsMSISlice() bool {
76 _, ok := v.data.([]map[string]interface{})
77 if !ok {
78 _, ok = v.data.([]Map)
79 if !ok {
80 s, ok := v.data.([]interface{})
81 if ok {
82 for i := range s {
83 switch s[i].(type) {
84 case Map:
85 case map[string]interface{}:
86 default:
87 return false
88 }
89 }
90 return true
91 }
92 }
93 }
94 return ok
95 }
96
97
98
99
100
101 func (v *Value) EachMSI(callback func(int, map[string]interface{}) bool) *Value {
102 for index, val := range v.MustMSISlice() {
103 carryon := callback(index, val)
104 if !carryon {
105 break
106 }
107 }
108 return v
109 }
110
111
112
113
114 func (v *Value) WhereMSI(decider func(int, map[string]interface{}) bool) *Value {
115 var selected []map[string]interface{}
116 v.EachMSI(func(index int, val map[string]interface{}) bool {
117 shouldSelect := decider(index, val)
118 if !shouldSelect {
119 selected = append(selected, val)
120 }
121 return true
122 })
123 return &Value{data: selected}
124 }
125
126
127
128
129 func (v *Value) GroupMSI(grouper func(int, map[string]interface{}) string) *Value {
130 groups := make(map[string][]map[string]interface{})
131 v.EachMSI(func(index int, val map[string]interface{}) bool {
132 group := grouper(index, val)
133 if _, ok := groups[group]; !ok {
134 groups[group] = make([]map[string]interface{}, 0)
135 }
136 groups[group] = append(groups[group], val)
137 return true
138 })
139 return &Value{data: groups}
140 }
141
142
143
144
145 func (v *Value) ReplaceMSI(replacer func(int, map[string]interface{}) map[string]interface{}) *Value {
146 arr := v.MustMSISlice()
147 replaced := make([]map[string]interface{}, len(arr))
148 v.EachMSI(func(index int, val map[string]interface{}) bool {
149 replaced[index] = replacer(index, val)
150 return true
151 })
152 return &Value{data: replaced}
153 }
154
155
156
157
158 func (v *Value) CollectMSI(collector func(int, map[string]interface{}) interface{}) *Value {
159 arr := v.MustMSISlice()
160 collected := make([]interface{}, len(arr))
161 v.EachMSI(func(index int, val map[string]interface{}) bool {
162 collected[index] = collector(index, val)
163 return true
164 })
165 return &Value{data: collected}
166 }
167
168
171
172
173
174 func (v *Value) ObjxMap(optionalDefault ...(Map)) Map {
175 if s, ok := v.data.((Map)); ok {
176 return s
177 }
178 if s, ok := v.data.(map[string]interface{}); ok {
179 return s
180 }
181 if len(optionalDefault) == 1 {
182 return optionalDefault[0]
183 }
184 return New(nil)
185 }
186
187
188
189
190 func (v *Value) MustObjxMap() Map {
191 if s, ok := v.data.(map[string]interface{}); ok {
192 return s
193 }
194 return v.data.((Map))
195 }
196
197
198
199 func (v *Value) ObjxMapSlice(optionalDefault ...[](Map)) [](Map) {
200 if s, ok := v.data.([]Map); ok {
201 return s
202 }
203
204 if s, ok := v.data.([]map[string]interface{}); ok {
205 result := make([]Map, len(s))
206 for i := range s {
207 result[i] = s[i]
208 }
209 return result
210 }
211
212 s, ok := v.data.([]interface{})
213 if !ok {
214 if len(optionalDefault) == 1 {
215 return optionalDefault[0]
216 }
217 return nil
218 }
219
220 result := make([]Map, len(s))
221 for i := range s {
222 switch s[i].(type) {
223 case Map:
224 result[i] = s[i].(Map)
225 case map[string]interface{}:
226 result[i] = New(s[i])
227 default:
228 return nil
229 }
230 }
231 return result
232 }
233
234
235
236
237 func (v *Value) MustObjxMapSlice() [](Map) {
238 if s := v.ObjxMapSlice(); s != nil {
239 return s
240 }
241 return v.data.([](Map))
242 }
243
244
245 func (v *Value) IsObjxMap() bool {
246 _, ok := v.data.((Map))
247 if !ok {
248 _, ok = v.data.(map[string]interface{})
249 }
250 return ok
251 }
252
253
254 func (v *Value) IsObjxMapSlice() bool {
255 _, ok := v.data.([](Map))
256 if !ok {
257 _, ok = v.data.([]map[string]interface{})
258 if !ok {
259 s, ok := v.data.([]interface{})
260 if ok {
261 for i := range s {
262 switch s[i].(type) {
263 case Map:
264 case map[string]interface{}:
265 default:
266 return false
267 }
268 }
269 return true
270 }
271 }
272 }
273
274 return ok
275 }
276
277
278
279
280
281 func (v *Value) EachObjxMap(callback func(int, Map) bool) *Value {
282 for index, val := range v.MustObjxMapSlice() {
283 carryon := callback(index, val)
284 if !carryon {
285 break
286 }
287 }
288 return v
289 }
290
291
292
293
294 func (v *Value) WhereObjxMap(decider func(int, Map) bool) *Value {
295 var selected [](Map)
296 v.EachObjxMap(func(index int, val Map) bool {
297 shouldSelect := decider(index, val)
298 if !shouldSelect {
299 selected = append(selected, val)
300 }
301 return true
302 })
303 return &Value{data: selected}
304 }
305
306
307
308
309 func (v *Value) GroupObjxMap(grouper func(int, Map) string) *Value {
310 groups := make(map[string][](Map))
311 v.EachObjxMap(func(index int, val Map) bool {
312 group := grouper(index, val)
313 if _, ok := groups[group]; !ok {
314 groups[group] = make([](Map), 0)
315 }
316 groups[group] = append(groups[group], val)
317 return true
318 })
319 return &Value{data: groups}
320 }
321
322
323
324
325 func (v *Value) ReplaceObjxMap(replacer func(int, Map) Map) *Value {
326 arr := v.MustObjxMapSlice()
327 replaced := make([](Map), len(arr))
328 v.EachObjxMap(func(index int, val Map) bool {
329 replaced[index] = replacer(index, val)
330 return true
331 })
332 return &Value{data: replaced}
333 }
334
335
336
337
338 func (v *Value) CollectObjxMap(collector func(int, Map) interface{}) *Value {
339 arr := v.MustObjxMapSlice()
340 collected := make([]interface{}, len(arr))
341 v.EachObjxMap(func(index int, val Map) bool {
342 collected[index] = collector(index, val)
343 return true
344 })
345 return &Value{data: collected}
346 }
347
View as plain text