logical/framework: adding a new duration type to convert to seconds
This commit is contained in:
parent
5c75a6c5c7
commit
6b23b14773
|
@ -373,6 +373,8 @@ func (t FieldType) Zero() interface{} {
|
||||||
return false
|
return false
|
||||||
case TypeMap:
|
case TypeMap:
|
||||||
return map[string]interface{}{}
|
return map[string]interface{}{}
|
||||||
|
case TypeDurationSecond:
|
||||||
|
return 0
|
||||||
default:
|
default:
|
||||||
panic("unknown type: " + t.String())
|
panic("unknown type: " + t.String())
|
||||||
}
|
}
|
||||||
|
|
|
@ -508,6 +508,16 @@ func TestFieldSchemaDefaultOrZero(t *testing.T) {
|
||||||
&FieldSchema{Type: TypeString},
|
&FieldSchema{Type: TypeString},
|
||||||
"",
|
"",
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"default duration set": {
|
||||||
|
&FieldSchema{Type: TypeDurationSecond, Default: 60},
|
||||||
|
60,
|
||||||
|
},
|
||||||
|
|
||||||
|
"default duration not set": {
|
||||||
|
&FieldSchema{Type: TypeDurationSecond},
|
||||||
|
0,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for name, tc := range cases {
|
for name, tc := range cases {
|
||||||
|
|
|
@ -2,6 +2,9 @@ package framework
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/mitchellh/mapstructure"
|
"github.com/mitchellh/mapstructure"
|
||||||
)
|
)
|
||||||
|
@ -64,13 +67,7 @@ func (d *FieldData) GetOkErr(k string) (interface{}, bool, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
switch schema.Type {
|
switch schema.Type {
|
||||||
case TypeBool:
|
case TypeBool, TypeInt, TypeMap, TypeDurationSecond, TypeString:
|
||||||
fallthrough
|
|
||||||
case TypeInt:
|
|
||||||
fallthrough
|
|
||||||
case TypeMap:
|
|
||||||
fallthrough
|
|
||||||
case TypeString:
|
|
||||||
return d.getPrimitive(k, schema)
|
return d.getPrimitive(k, schema)
|
||||||
default:
|
default:
|
||||||
return nil, false,
|
return nil, false,
|
||||||
|
@ -114,6 +111,38 @@ func (d *FieldData) getPrimitive(
|
||||||
}
|
}
|
||||||
|
|
||||||
return result, true, nil
|
return result, true, nil
|
||||||
|
|
||||||
|
case TypeDurationSecond:
|
||||||
|
var result int
|
||||||
|
switch inp := raw.(type) {
|
||||||
|
case int:
|
||||||
|
result = inp
|
||||||
|
case float32:
|
||||||
|
result = int(inp)
|
||||||
|
case float64:
|
||||||
|
result = int(inp)
|
||||||
|
case string:
|
||||||
|
// Look for a suffix otherwise its a plain second value
|
||||||
|
if strings.HasSuffix(inp, "s") || strings.HasSuffix(inp, "m") || strings.HasSuffix(inp, "h") {
|
||||||
|
dur, err := time.ParseDuration(inp)
|
||||||
|
if err != nil {
|
||||||
|
return nil, true, err
|
||||||
|
}
|
||||||
|
result = int(dur.Seconds())
|
||||||
|
} else {
|
||||||
|
// Plain integer
|
||||||
|
val, err := strconv.ParseInt(inp, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return nil, true, err
|
||||||
|
}
|
||||||
|
result = int(val)
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return nil, false, fmt.Errorf("invalid input '%v'", raw)
|
||||||
|
}
|
||||||
|
return result, true, nil
|
||||||
|
|
||||||
default:
|
default:
|
||||||
panic(fmt.Sprintf("Unknown type: %s", schema.Type))
|
panic(fmt.Sprintf("Unknown type: %s", schema.Type))
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,6 +91,50 @@ func TestFieldDataGet(t *testing.T) {
|
||||||
"child": true,
|
"child": true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
"duration type, string value": {
|
||||||
|
map[string]*FieldSchema{
|
||||||
|
"foo": &FieldSchema{Type: TypeDurationSecond},
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"foo": "42",
|
||||||
|
},
|
||||||
|
"foo",
|
||||||
|
42,
|
||||||
|
},
|
||||||
|
|
||||||
|
"duration type, string duration value": {
|
||||||
|
map[string]*FieldSchema{
|
||||||
|
"foo": &FieldSchema{Type: TypeDurationSecond},
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"foo": "42m",
|
||||||
|
},
|
||||||
|
"foo",
|
||||||
|
2520,
|
||||||
|
},
|
||||||
|
|
||||||
|
"duration type, int value": {
|
||||||
|
map[string]*FieldSchema{
|
||||||
|
"foo": &FieldSchema{Type: TypeDurationSecond},
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"foo": 42,
|
||||||
|
},
|
||||||
|
"foo",
|
||||||
|
42,
|
||||||
|
},
|
||||||
|
|
||||||
|
"duration type, float value": {
|
||||||
|
map[string]*FieldSchema{
|
||||||
|
"foo": &FieldSchema{Type: TypeDurationSecond},
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"foo": 42.0,
|
||||||
|
},
|
||||||
|
"foo",
|
||||||
|
42,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for name, tc := range cases {
|
for name, tc := range cases {
|
||||||
|
|
|
@ -9,6 +9,10 @@ const (
|
||||||
TypeInt
|
TypeInt
|
||||||
TypeBool
|
TypeBool
|
||||||
TypeMap
|
TypeMap
|
||||||
|
|
||||||
|
// TypeDurationSecond represent as seconds, this can be either an
|
||||||
|
// integer or go duration format string (e.g. 24h)
|
||||||
|
TypeDurationSecond
|
||||||
)
|
)
|
||||||
|
|
||||||
func (t FieldType) String() string {
|
func (t FieldType) String() string {
|
||||||
|
@ -21,6 +25,8 @@ func (t FieldType) String() string {
|
||||||
return "bool"
|
return "bool"
|
||||||
case TypeMap:
|
case TypeMap:
|
||||||
return "map"
|
return "map"
|
||||||
|
case TypeDurationSecond:
|
||||||
|
return "duration (sec)"
|
||||||
default:
|
default:
|
||||||
return "unknown type"
|
return "unknown type"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue