Skip to content

Commit 53d2e41

Browse files
author
Christos Kotsis
committed
fixes: [docs/convert] methods
Features Cache.GetError: "Method for returning Cache.E" Convert: "New methods GetString, GetInt, GetError" Fixes: Storage.AddDoc: "Now switches to the correct index after adding a new doc" Storage.Read: "No longer creates nil docs on read" Storage.Write: "No longer skips empty maps" Tests: MultiDoc: "Tests for checking doc switch & add"
1 parent 8663ea3 commit 53d2e41

File tree

6 files changed

+176
-84
lines changed

6 files changed

+176
-84
lines changed

README.md

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -265,10 +265,13 @@ Next, assert **obj** as `map[string]string`
265265
assertData := db.NewConvertFactory()
266266
267267
assertData.Input(val)
268-
if assertData.Error != nil {
269-
logger.Fatalf(assertData.Error.Error())
268+
if assertData.GetError() != nil {
269+
logger.Fatal(assertData.GetError())
270+
}
271+
vMap, err := assertData.GetMap()
272+
if err != nil {
273+
logger.Fatal(err)
270274
}
271-
vMap := assertData.GetMap()
272275
logger.Info(vMap["key-2"])
273276
274277
```
@@ -285,10 +288,13 @@ assertData.Input(state.Data).
285288
Key("to").
286289
Key("array-1").
287290
Key("key-1").Index(0)
288-
if assertData.Error != nil {
289-
logger.Fatalf(assertData.Error.Error())
291+
if assertData.GetError() != nil {
292+
logger.Fatal(assertData.GetError())
293+
}
294+
vMap, err := assertData.GetMap()
295+
if err != nil {
296+
logger.Fatal(err)
290297
}
291-
vMap := assertData.GetMap()
292298
logger.Info(vMap["key-2"])
293299
294300
```
@@ -318,10 +324,13 @@ Next, assert **obj** as `[]string`
318324
assertData := db.NewConvertFactory()
319325
320326
assertData.Input(obj)
321-
if assertData.Error != nil {
322-
logger.Fatalf(assertData.Error.Error())
327+
if assertData.GetError() != nil {
328+
logger.Fatal(assertData.GetError())
329+
}
330+
vArray, err := assertData.GetArray()
331+
if err != nil {
332+
logger.Fatal(err)
323333
}
324-
vArray := assertData.GetArray()
325334
logger.Info(vArray)
326335
327336
```
@@ -335,10 +344,13 @@ We can get the array manually by using only **Convert** operations
335344
assertData.Input(state.Data).
336345
Key("to").
337346
Key("array-2")
338-
if assertData.Error != nil {
339-
logger.Fatalf(assertData.Error.Error())
347+
if assertData.GetError() != nil {
348+
logger.Fatal(assertData.GetError())
349+
}
350+
vArray, err := assertData.GetArray()
351+
if err != nil {
352+
logger.Fatal(err)
340353
}
341-
vArray := assertData.GetArray()
342354
logger.Info(vArray)
343355
344356
```

db/cache.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ func NewCacheFactory() Cache {
2323
return cache
2424
}
2525

26+
// GetError returns cache error field
27+
func (c *Cache) GetError() error {
28+
return c.E
29+
}
30+
2631
// Clear for clearing the cache and setting all
2732
// content to nil
2833
func (c *Cache) Clear() *Cache {

db/convert.go

Lines changed: 88 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -9,125 +9,154 @@ import (
99
// AssertData is used to for converting interface objects to
1010
// map of interfaces or array of interfaces
1111
type AssertData struct {
12-
D0 map[string]string
13-
A0 []string
14-
Error error
15-
Cache Cache
12+
d0 map[string]string
13+
s0 *string
14+
s1 []string
15+
i0 *int
16+
i1 []int
17+
cache Cache
1618
}
1719

1820
// NewConvertFactory for initializing AssertData
1921
func NewConvertFactory() *AssertData {
20-
assertData := &AssertData{
21-
D0: make(map[string]string),
22-
A0: make([]string, 0),
23-
Cache: NewCacheFactory(),
22+
ad := &AssertData{
23+
d0: make(map[string]string),
24+
s1: make([]string, 0),
25+
cache: NewCacheFactory(),
2426
}
25-
return assertData
27+
return ad
2628
}
2729

2830
// Clear for resetting AssertData
2931
func (a *AssertData) Clear() {
30-
a.Cache.Clear()
31-
a.D0 = make(map[string]string)
32-
a.A0 = make([]string, 0)
32+
a.cache.Clear()
33+
a.d0 = make(map[string]string)
34+
a.s1 = make([]string, 0)
35+
a.i1 = make([]int, 0)
36+
a.i0 = nil
37+
a.s0 = nil
38+
}
39+
40+
// GetError returns the any error set to AssertData
41+
func (a *AssertData) GetError() error {
42+
return a.cache.GetError()
43+
}
44+
45+
func (a *AssertData) setErr(e ...error) *AssertData {
46+
if len(e) > 0 {
47+
a.cache.E = e[0]
48+
}
49+
return a
3350
}
3451

3552
// Input sets a data source that can be used for assertion
3653
func (a *AssertData) Input(o interface{}) *AssertData {
3754
a.Clear()
38-
a.Cache.V1 = o
55+
a.cache.V1 = o
3956
return a
4057
}
4158

42-
func (a *AssertData) toBytes() {
43-
a.Cache.B, a.Cache.E = yaml.Marshal(a.Cache.V1)
44-
if a.Cache.E != nil {
45-
a.Error = a.Cache.E
59+
// GetString asserts the input as string
60+
func (a *AssertData) GetString() (string, error) {
61+
if a.GetError() != nil {
62+
return "", a.GetError()
63+
}
64+
65+
s, isString := a.cache.V1.(string)
66+
if !isString {
67+
a.setErr(wrapErr(fmt.Errorf(notAType, "string"), getFn()))
68+
return "", a.GetError()
4669
}
70+
71+
return s, nil
72+
}
73+
74+
// GetInt asserts the input as int
75+
func (a *AssertData) GetInt() (int, error) {
76+
if a.GetError() != nil {
77+
return 0, a.GetError()
78+
}
79+
80+
i, isInt := a.cache.V1.(int)
81+
if !isInt {
82+
a.setErr(wrapErr(fmt.Errorf(notAType, "int"), getFn()))
83+
return 0, a.GetError()
84+
}
85+
86+
return i, nil
4787
}
4888

4989
// GetMap for converting a map[interface{}]interface{} into a map[string]string
50-
func (a *AssertData) GetMap() map[string]string {
51-
if a.Cache.E != nil {
52-
a.Error = a.Cache.E
53-
return nil
90+
func (a *AssertData) GetMap() (map[string]string, error) {
91+
if a.GetError() != nil {
92+
return nil, a.GetError()
5493
}
5594

56-
a.toBytes()
57-
if a.Cache.E != nil {
58-
return nil
95+
a.cache.B, a.cache.E = yaml.Marshal(a.cache.V1)
96+
if a.GetError() != nil {
97+
return nil, a.GetError()
5998
}
6099

61-
a.Cache.E = yaml.Unmarshal(a.Cache.B, &a.D0)
62-
if a.Cache.E != nil {
63-
a.Error = a.Cache.E
64-
return nil
100+
a.cache.E = yaml.Unmarshal(a.cache.B, &a.d0)
101+
if a.GetError() != nil {
102+
return nil, a.GetError()
65103
}
66-
return a.D0
104+
return a.d0, nil
67105
}
68106

69107
// GetArray for converting a []interface{} to []string
70-
func (a *AssertData) GetArray() []string {
71-
if a.Cache.E != nil {
72-
a.Error = a.Cache.E
73-
return nil
108+
func (a *AssertData) GetArray() ([]string, error) {
109+
if a.GetError() != nil {
110+
return nil, a.GetError()
74111
}
75112

76-
_, isArray := a.Cache.V1.([]interface{})
113+
_, isArray := a.cache.V1.([]interface{})
77114
if !isArray {
78-
a.Cache.E = wrapErr(fmt.Errorf(notArrayObj), getFn())
79-
a.Error = a.Cache.E
80-
return nil
115+
a.setErr(wrapErr(fmt.Errorf(notArrayObj), getFn()))
116+
return nil, a.GetError()
81117
}
82118

83-
a.toBytes()
84-
if a.Cache.E != nil {
85-
return nil
119+
a.cache.B, a.cache.E = yaml.Marshal(a.cache.V1)
120+
if a.GetError() != nil {
121+
return nil, a.GetError()
86122
}
87123

88-
a.Cache.E = yaml.Unmarshal(a.Cache.B, &a.A0)
89-
if a.Cache.E != nil {
90-
a.Error = a.Cache.E
91-
return nil
124+
a.cache.E = yaml.Unmarshal(a.cache.B, &a.s1)
125+
if a.GetError() != nil {
126+
return nil, a.GetError()
92127
}
93128

94-
return a.A0
129+
return a.s1, nil
95130
}
96131

97132
// Key copies initial interface object and returns a map of interfaces{}
98133
// Used to easily pipe interfaces
99134
func (a *AssertData) Key(k string) *AssertData {
100-
if a.Cache.E != nil {
101-
a.Error = a.Cache.E
135+
if a.GetError() != nil {
102136
return a
103137
}
104138

105-
_, isMap := a.Cache.V1.(map[interface{}]interface{})
139+
_, isMap := a.cache.V1.(map[interface{}]interface{})
106140
if !isMap {
107-
a.Cache.E = wrapErr(fmt.Errorf(notAMap), getFn())
108-
a.Error = a.Cache.E
109-
return a
141+
return a.setErr(wrapErr(fmt.Errorf(notAMap), getFn()))
110142
}
111143

112-
a.Cache.V1 = a.Cache.V1.(map[interface{}]interface{})[k]
144+
a.cache.V1 = a.cache.V1.(map[interface{}]interface{})[k]
113145

114146
return a
115147
}
116148

117149
// Index getting an interface{} from a []interface{}
118150
func (a *AssertData) Index(i int) *AssertData {
119-
if a.Cache.E != nil {
120-
a.Error = a.Cache.E
151+
if a.GetError() != nil {
121152
return a
122153
}
123154

124-
_, isArray := a.Cache.V1.([]interface{})
155+
_, isArray := a.cache.V1.([]interface{})
125156
if !isArray {
126-
a.Cache.E = wrapErr(fmt.Errorf(notArrayObj), getFn())
127-
a.Error = a.Cache.E
128-
return a
157+
return a.setErr(wrapErr(fmt.Errorf(notArrayObj), getFn()))
129158
}
130-
a.Cache.V1 = a.Cache.V1.([]interface{})[i]
159+
a.cache.V1 = a.cache.V1.([]interface{})[i]
131160

132161
return a
133162
}

db/errors.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const (
2020
libOutOfIndex = "lib out of index"
2121
docNotExists = "doc [%s] does not exist in lib"
2222
fieldNotString = "[%s] with value [%s] is not a string"
23+
notAType = "value is not a %s"
2324
)
2425

2526
func wrapErr(e error, s string) error {

db/storage.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ func (s *Storage) Switch(i int) error {
120120
// AddDoc will add a new document to the stack and will switch
121121
// Active Document index to that document
122122
func (s *Storage) AddDoc() error {
123-
s.AD++
123+
s.AD = len(s.Data)
124124
s.Data = append(s.Data, make(map[interface{}]interface{}))
125125
return s.stateReload()
126126
}
@@ -198,14 +198,12 @@ func (s *Storage) Read() error {
198198
s.Data = nil
199199
s.Data = make([]interface{}, 0)
200200

201-
var counter int
202201
var data interface{}
203202
dec := yaml.NewDecoder(bytes.NewReader(f))
204203
for {
205-
s.Data = append(s.Data, data)
206-
err := dec.Decode(&s.Data[counter])
204+
err := dec.Decode(&data)
207205
if err == nil {
208-
counter++
206+
s.Data = append(s.Data, data)
209207
data = nil
210208
continue
211209
}
@@ -236,8 +234,6 @@ func (s *Storage) Write() error {
236234
for _, j := range s.Data {
237235
if j == nil {
238236
continue
239-
} else if v, ok := j.(map[interface{}]interface{}); ok && len(v) == 0 {
240-
continue
241237
}
242238

243239
err := enc.Encode(j)

0 commit comments

Comments
 (0)