mirror of
https://github.com/diamondburned/arikawa.git
synced 2024-11-30 10:43:30 +00:00
discord: ContainerComponents.Unmarshal for number types
This commit adds int*, uint* and float* parsing support into ContainerComponents.Unmarshal.
This commit is contained in:
parent
6412cf74ff
commit
7961d18278
|
@ -3,6 +3,7 @@ package discord
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/diamondburned/arikawa/v3/internal/rfutil"
|
"github.com/diamondburned/arikawa/v3/internal/rfutil"
|
||||||
|
@ -71,6 +72,7 @@ func (c *ContainerComponents) Find(customID ComponentID) Component {
|
||||||
// The following types are supported:
|
// The following types are supported:
|
||||||
//
|
//
|
||||||
// - string (SelectComponent if range = [n, 1], TextInputComponent)
|
// - string (SelectComponent if range = [n, 1], TextInputComponent)
|
||||||
|
// - int*, uint*, float* (uses Parse{Int,Uint,Float}, SelectComponent if range = [n, 1], TextInputComponent)
|
||||||
// - bool (ButtonComponent or any component, true if present)
|
// - bool (ButtonComponent or any component, true if present)
|
||||||
// - []string (SelectComponent)
|
// - []string (SelectComponent)
|
||||||
//
|
//
|
||||||
|
@ -128,11 +130,14 @@ func (c *ContainerComponents) Unmarshal(v interface{}) error {
|
||||||
return fmt.Errorf("component %q is required but not found", name)
|
return fmt.Errorf("component %q is required but not found", name)
|
||||||
}
|
}
|
||||||
|
|
||||||
switch fieldt.Kind() {
|
switch fieldk := fieldt.Kind(); fieldk {
|
||||||
case reflect.Bool:
|
case reflect.Bool:
|
||||||
// Intended for ButtonComponents.
|
// Intended for ButtonComponents.
|
||||||
fieldv.Set(reflect.ValueOf(true).Convert(fieldt))
|
fieldv.Set(reflect.ValueOf(true).Convert(fieldt))
|
||||||
case reflect.String:
|
case reflect.String,
|
||||||
|
reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
|
||||||
|
reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,
|
||||||
|
reflect.Float32, reflect.Float64:
|
||||||
var v string
|
var v string
|
||||||
|
|
||||||
switch component := component.(type) {
|
switch component := component.(type) {
|
||||||
|
@ -151,7 +156,30 @@ func (c *ContainerComponents) Unmarshal(v interface{}) error {
|
||||||
return fmt.Errorf("component %q is of unsupported type %T", name, component)
|
return fmt.Errorf("component %q is of unsupported type %T", name, component)
|
||||||
}
|
}
|
||||||
|
|
||||||
fieldv.Set(reflect.ValueOf(v).Convert(fieldt))
|
switch fieldk {
|
||||||
|
case reflect.String:
|
||||||
|
fieldv.Set(reflect.ValueOf(v).Convert(fieldt))
|
||||||
|
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||||
|
i, err := strconv.ParseInt(v, 10, rfutil.KindBits(fieldk))
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("component %q has invalid integer: %v", name, err)
|
||||||
|
}
|
||||||
|
fieldv.Set(reflect.ValueOf(i).Convert(fieldt))
|
||||||
|
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
|
||||||
|
u, err := strconv.ParseUint(v, 10, rfutil.KindBits(fieldk))
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("component %q has invalid unsigned (positive) integer: %v", name, err)
|
||||||
|
}
|
||||||
|
fieldv.Set(reflect.ValueOf(u).Convert(fieldt))
|
||||||
|
case reflect.Float32, reflect.Float64:
|
||||||
|
f, err := strconv.ParseFloat(v, rfutil.KindBits(fieldk))
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("component %q has invalid floating-point number: %v", name, err)
|
||||||
|
}
|
||||||
|
fieldv.Set(reflect.ValueOf(f).Convert(fieldt))
|
||||||
|
default:
|
||||||
|
panic("unreachable")
|
||||||
|
}
|
||||||
case reflect.Slice:
|
case reflect.Slice:
|
||||||
elemt := fieldt.Elem()
|
elemt := fieldt.Elem()
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ package rfutil
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"math/bits"
|
||||||
"reflect"
|
"reflect"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -24,3 +25,21 @@ func StructRValue(rv reflect.Value) (reflect.Value, reflect.Type, error) {
|
||||||
|
|
||||||
return rv, rt, nil
|
return rv, rt, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// KindBits works on int*, uint* and float* only.
|
||||||
|
func KindBits(k reflect.Kind) int {
|
||||||
|
switch k {
|
||||||
|
case reflect.Int, reflect.Uint:
|
||||||
|
return bits.UintSize
|
||||||
|
case reflect.Int8, reflect.Uint8:
|
||||||
|
return 8
|
||||||
|
case reflect.Int16, reflect.Uint16:
|
||||||
|
return 16
|
||||||
|
case reflect.Int32, reflect.Uint32, reflect.Float32:
|
||||||
|
return 32
|
||||||
|
case reflect.Int64, reflect.Uint64, reflect.Float64:
|
||||||
|
return 64
|
||||||
|
default:
|
||||||
|
panic("unknown kind " + k.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue