Skip to content

Commit 2296e32

Browse files
author
dmitriy kalinin
committed
allow error message on op defintions to show better error messages
1 parent 91816e9 commit 2296e32

File tree

5 files changed

+86
-0
lines changed

5 files changed

+86
-0
lines changed

patch/descriptive_op.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package patch
2+
3+
import (
4+
"fmt"
5+
)
6+
7+
type DescriptiveOp struct {
8+
Op Op
9+
ErrorMsg string
10+
}
11+
12+
func (op DescriptiveOp) Apply(doc interface{}) (interface{}, error) {
13+
doc, err := op.Op.Apply(doc)
14+
if err != nil {
15+
return nil, fmt.Errorf("Error '%s': %s", op.ErrorMsg, err.Error())
16+
}
17+
return doc, nil
18+
}

patch/integration_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,4 +159,36 @@ jobs:
159159

160160
Expect(res).To(Equal(out))
161161
})
162+
163+
It("shows custom error messages", func() {
164+
inStr := `
165+
releases:
166+
- name: capi
167+
version: 0.1
168+
`
169+
170+
var in interface{}
171+
172+
err := yaml.Unmarshal([]byte(inStr), &in)
173+
Expect(err).ToNot(HaveOccurred())
174+
175+
opsStr := `
176+
- type: remove
177+
path: /releases/0/not-there
178+
error: "Custom error message"
179+
`
180+
181+
var opDefs []OpDefinition
182+
183+
err = yaml.Unmarshal([]byte(opsStr), &opDefs)
184+
Expect(err).ToNot(HaveOccurred())
185+
186+
ops, err := NewOpsFromDefinitions(opDefs)
187+
Expect(err).ToNot(HaveOccurred())
188+
189+
_, err = ops.Apply(in)
190+
Expect(err).To(HaveOccurred())
191+
Expect(err.Error()).To(Equal(
192+
"Error 'Custom error message': Expected to find a map key 'not-there' for path '/releases/0/not-there' (found map keys: 'name', 'version')"))
193+
})
162194
})

patch/op_definition.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ type OpDefinition struct {
1111
Type string `json:",omitempty"`
1212
Path *string `json:",omitempty"`
1313
Value *interface{} `json:",omitempty"`
14+
15+
Error *string `json:",omitempty"`
1416
}
1517

1618
type parser struct{}
@@ -42,6 +44,10 @@ func NewOpsFromDefinitions(opDefs []OpDefinition) (Ops, error) {
4244
return nil, fmt.Errorf("Unknown operation [%d] with type '%s' within\n%s", i, opDef.Type, opFmt)
4345
}
4446

47+
if opDef.Error != nil {
48+
op = DescriptiveOp{Op: op, ErrorMsg: *opDef.Error}
49+
}
50+
4551
ops = append(ops, op)
4652
}
4753

patch/op_definition_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ var _ = Describe("NewOpsFromDefinitions", func() {
1111
var (
1212
path = "/abc"
1313
invalidPath = "abc"
14+
errorMsg = "error"
1415
val interface{} = 123
1516
complexVal interface{} = map[interface{}]interface{}{123: 123}
1617
)
@@ -57,6 +58,20 @@ var _ = Describe("NewOpsFromDefinitions", func() {
5758
})
5859

5960
Describe("replace", func() {
61+
It("allows error description", func() {
62+
opDefs := []OpDefinition{{Type: "replace", Path: &path, Value: &val, Error: &errorMsg}}
63+
64+
ops, err := NewOpsFromDefinitions(opDefs)
65+
Expect(err).ToNot(HaveOccurred())
66+
67+
Expect(ops).To(Equal(Ops([]Op{
68+
DescriptiveOp{
69+
Op: ReplaceOp{Path: MustNewPointerFromString("/abc"), Value: 123},
70+
ErrorMsg: errorMsg,
71+
},
72+
})))
73+
})
74+
6075
It("requires path", func() {
6176
_, err := NewOpsFromDefinitions([]OpDefinition{{Type: "replace"}})
6277
Expect(err).To(HaveOccurred())
@@ -89,6 +104,20 @@ var _ = Describe("NewOpsFromDefinitions", func() {
89104
})
90105

91106
Describe("remove", func() {
107+
It("allows error description", func() {
108+
opDefs := []OpDefinition{{Type: "remove", Path: &path, Error: &errorMsg}}
109+
110+
ops, err := NewOpsFromDefinitions(opDefs)
111+
Expect(err).ToNot(HaveOccurred())
112+
113+
Expect(ops).To(Equal(Ops([]Op{
114+
DescriptiveOp{
115+
Op: RemoveOp{Path: MustNewPointerFromString("/abc")},
116+
ErrorMsg: errorMsg,
117+
},
118+
})))
119+
})
120+
92121
It("requires path", func() {
93122
_, err := NewOpsFromDefinitions([]OpDefinition{{Type: "remove"}})
94123
Expect(err).To(HaveOccurred())

patch/ops.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ var _ Op = Ops{}
1111
var _ Op = ReplaceOp{}
1212
var _ Op = RemoveOp{}
1313
var _ Op = FindOp{}
14+
var _ Op = DescriptiveOp{}
1415
var _ Op = ErrOp{}
1516

1617
func (ops Ops) Apply(doc interface{}) (interface{}, error) {

0 commit comments

Comments
 (0)