internal/reqdata Parse() does not return errors anymore

This commit is contained in:
Adrien Marquès 2020-03-21 14:20:26 +01:00
parent 3a258400c0
commit 149ec9a9a0
Signed by: xdrm-brackets
GPG Key ID: D75243CA236D825E
2 changed files with 36 additions and 105 deletions

View File

@ -22,31 +22,22 @@ type Parameter struct {
} }
// Parse parameter (json-like) if not already done // Parse parameter (json-like) if not already done
func (i *Parameter) Parse() error { func (i *Parameter) Parse() {
/* (1) Stop if already parsed or nil*/ /* ignore already parsed or nil*/
if i.Parsed || i.Value == nil { if i.Parsed || i.Value == nil {
return nil return
}
/* (2) Try to parse value */
parsed, err := parseParameter(i.Value)
if err != nil {
return err
} }
/* parse value */
i.Parsed = true i.Parsed = true
i.Value = parsed i.Value = parseParameter(i.Value)
return nil
} }
// parseParameter parses http GET/POST data // parseParameter parses http URI/GET/POST data
// - []string // - []string : return array of json elements
// - size = 1 : return json of first element // - string : return json if valid, else return raw string
// - size > 1 : return array of json elements func parseParameter(data interface{}) interface{} {
// - string : return json if valid, else return raw string
func parseParameter(data interface{}) (interface{}, error) {
dtype := reflect.TypeOf(data) dtype := reflect.TypeOf(data)
dvalue := reflect.ValueOf(data) dvalue := reflect.ValueOf(data)
@ -57,7 +48,7 @@ func parseParameter(data interface{}) (interface{}, error) {
// 1. ignore empty // 1. ignore empty
if dvalue.Len() == 0 { if dvalue.Len() == 0 {
return data, nil return data
} }
// 2. parse each element recursively // 2. parse each element recursively
@ -65,20 +56,9 @@ func parseParameter(data interface{}) (interface{}, error) {
for i, l := 0, dvalue.Len(); i < l; i++ { for i, l := 0, dvalue.Len(); i < l; i++ {
element := dvalue.Index(i) element := dvalue.Index(i)
result[i] = parseParameter(element.Interface())
// ignore non-string
if element.Kind() != reflect.String {
result[i] = element.Interface()
continue
}
parsed, err := parseParameter(element.String())
if err != nil {
return data, err
}
result[i] = parsed
} }
return result, nil return result
/* (2) string -> parse */ /* (2) string -> parse */
case reflect.String: case reflect.String:
@ -91,27 +71,25 @@ func parseParameter(data interface{}) (interface{}, error) {
err := json.Unmarshal([]byte(wrapper), &result) err := json.Unmarshal([]byte(wrapper), &result)
// return if success // return if success
if err == nil { if err != nil {
return dvalue.String()
mapval, ok := result.(map[string]interface{})
if !ok {
return dvalue.String(), ErrInvalidRootType
}
wrapped, ok := mapval["wrapped"]
if !ok {
return dvalue.String(), ErrInvalidJSON
}
return wrapped, nil
} }
// else return as string mapval, ok := result.(map[string]interface{})
return dvalue.String(), nil if !ok {
return dvalue.String()
}
wrapped, ok := mapval["wrapped"]
if !ok {
return dvalue.String()
}
return wrapped
} }
/* (3) NIL if unknown type */ /* (3) NIL if unknown type */
return dvalue.Interface(), nil return dvalue.Interface()
} }

View File

@ -6,14 +6,8 @@ import (
) )
func TestSimpleString(t *testing.T) { func TestSimpleString(t *testing.T) {
p := Parameter{Parsed: false, File: false, Value: "some-string"} p := Parameter{Value: "some-string"}
p.Parse()
err := p.Parse()
if err != nil {
t.Errorf("unexpected error: <%s>", err)
t.FailNow()
}
if !p.Parsed { if !p.Parsed {
t.Errorf("expected parameter to be parsed") t.Errorf("expected parameter to be parsed")
@ -38,11 +32,7 @@ func TestSimpleFloat(t *testing.T) {
for i, tcase := range tcases { for i, tcase := range tcases {
t.Run("case "+string(i), func(t *testing.T) { t.Run("case "+string(i), func(t *testing.T) {
p := Parameter{Parsed: false, File: false, Value: tcase} p := Parameter{Parsed: false, File: false, Value: tcase}
p.Parse()
if err := p.Parse(); err != nil {
t.Errorf("unexpected error: <%s>", err)
t.FailNow()
}
if !p.Parsed { if !p.Parsed {
t.Errorf("expected parameter to be parsed") t.Errorf("expected parameter to be parsed")
@ -70,10 +60,7 @@ func TestSimpleBool(t *testing.T) {
t.Run("case "+string(i), func(t *testing.T) { t.Run("case "+string(i), func(t *testing.T) {
p := Parameter{Parsed: false, File: false, Value: tcase} p := Parameter{Parsed: false, File: false, Value: tcase}
if err := p.Parse(); err != nil { p.Parse()
t.Errorf("unexpected error: <%s>", err)
t.FailNow()
}
if !p.Parsed { if !p.Parsed {
t.Errorf("expected parameter to be parsed") t.Errorf("expected parameter to be parsed")
@ -96,13 +83,7 @@ func TestSimpleBool(t *testing.T) {
func TestJsonStringSlice(t *testing.T) { func TestJsonStringSlice(t *testing.T) {
p := Parameter{Parsed: false, File: false, Value: `["str1", "str2"]`} p := Parameter{Parsed: false, File: false, Value: `["str1", "str2"]`}
p.Parse()
err := p.Parse()
if err != nil {
t.Errorf("unexpected error: <%s>", err)
t.FailNow()
}
if !p.Parsed { if !p.Parsed {
t.Errorf("expected parameter to be parsed") t.Errorf("expected parameter to be parsed")
@ -140,13 +121,7 @@ func TestJsonStringSlice(t *testing.T) {
func TestStringSlice(t *testing.T) { func TestStringSlice(t *testing.T) {
p := Parameter{Parsed: false, File: false, Value: []string{"str1", "str2"}} p := Parameter{Parsed: false, File: false, Value: []string{"str1", "str2"}}
p.Parse()
err := p.Parse()
if err != nil {
t.Errorf("unexpected error: <%s>", err)
t.FailNow()
}
if !p.Parsed { if !p.Parsed {
t.Errorf("expected parameter to be parsed") t.Errorf("expected parameter to be parsed")
@ -194,12 +169,7 @@ func TestJsonPrimitiveBool(t *testing.T) {
for i, tcase := range tcases { for i, tcase := range tcases {
t.Run("case "+string(i), func(t *testing.T) { t.Run("case "+string(i), func(t *testing.T) {
p := Parameter{Parsed: false, File: false, Value: tcase.Raw} p := Parameter{Parsed: false, File: false, Value: tcase.Raw}
p.Parse()
err := p.Parse()
if err != nil {
t.Errorf("unexpected error: <%s>", err)
t.FailNow()
}
if !p.Parsed { if !p.Parsed {
t.Errorf("expected parameter to be parsed") t.Errorf("expected parameter to be parsed")
@ -242,12 +212,7 @@ func TestJsonPrimitiveFloat(t *testing.T) {
for i, tcase := range tcases { for i, tcase := range tcases {
t.Run("case "+string(i), func(t *testing.T) { t.Run("case "+string(i), func(t *testing.T) {
p := Parameter{Parsed: false, File: false, Value: tcase.Raw} p := Parameter{Parsed: false, File: false, Value: tcase.Raw}
p.Parse()
err := p.Parse()
if err != nil {
t.Errorf("unexpected error: <%s>", err)
t.FailNow()
}
if !p.Parsed { if !p.Parsed {
t.Errorf("expected parameter to be parsed") t.Errorf("expected parameter to be parsed")
@ -271,13 +236,7 @@ func TestJsonPrimitiveFloat(t *testing.T) {
func TestJsonBoolSlice(t *testing.T) { func TestJsonBoolSlice(t *testing.T) {
p := Parameter{Parsed: false, File: false, Value: []string{"true", "false"}} p := Parameter{Parsed: false, File: false, Value: []string{"true", "false"}}
p.Parse()
err := p.Parse()
if err != nil {
t.Errorf("unexpected error: <%s>", err)
t.FailNow()
}
if !p.Parsed { if !p.Parsed {
t.Errorf("expected parameter to be parsed") t.Errorf("expected parameter to be parsed")
@ -315,13 +274,7 @@ func TestJsonBoolSlice(t *testing.T) {
func TestBoolSlice(t *testing.T) { func TestBoolSlice(t *testing.T) {
p := Parameter{Parsed: false, File: false, Value: []bool{true, false}} p := Parameter{Parsed: false, File: false, Value: []bool{true, false}}
p.Parse()
err := p.Parse()
if err != nil {
t.Errorf("unexpected error: <%s>", err)
t.FailNow()
}
if !p.Parsed { if !p.Parsed {
t.Errorf("expected parameter to be parsed") t.Errorf("expected parameter to be parsed")