internal/reqdata Parse() does not return errors anymore
This commit is contained in:
parent
3a258400c0
commit
149ec9a9a0
|
@ -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()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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")
|
||||||
|
|
Loading…
Reference in New Issue