✨ Make IntOrString support TOML as well
This commit is contained in:
parent
f4497aef7e
commit
e8401db519
3 changed files with 77 additions and 17 deletions
51
types/int_string.go
Normal file
51
types/int_string.go
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
package types
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
type IntOrString struct {
|
||||||
|
intVal int
|
||||||
|
strVal string
|
||||||
|
isInt bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (is *IntOrString) Set(val any) error {
|
||||||
|
switch v := val.(type) {
|
||||||
|
case int:
|
||||||
|
case int8:
|
||||||
|
case int16:
|
||||||
|
case int32:
|
||||||
|
case int64:
|
||||||
|
case uint:
|
||||||
|
case uint8:
|
||||||
|
case uint16:
|
||||||
|
case uint32:
|
||||||
|
is.isInt = true
|
||||||
|
is.intVal = int(v)
|
||||||
|
return nil
|
||||||
|
case string:
|
||||||
|
is.isInt = false
|
||||||
|
is.strVal = v
|
||||||
|
return nil
|
||||||
|
case []byte:
|
||||||
|
is.isInt = false
|
||||||
|
is.strVal = string(v)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
//nolint:err113 // Temp skip
|
||||||
|
return fmt.Errorf("invalid type: %T", val)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (is IntOrString) IsZero() bool {
|
||||||
|
if is.isInt {
|
||||||
|
return is.intVal == 0
|
||||||
|
}
|
||||||
|
return is.strVal == ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (is IntOrString) Value() any {
|
||||||
|
if is.isInt {
|
||||||
|
return is.intVal
|
||||||
|
}
|
||||||
|
return is.strVal
|
||||||
|
}
|
||||||
25
types/toml.go
Normal file
25
types/toml.go
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
package types
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
type TomlTypeError struct {
|
||||||
|
Value any
|
||||||
|
}
|
||||||
|
|
||||||
|
func (te *TomlTypeError) Error() string {
|
||||||
|
return fmt.Sprintf("unsupported type: %T", te.Value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (is *IntOrString) UnmarshalTOML(val any) error {
|
||||||
|
switch v := val.(type) {
|
||||||
|
case string:
|
||||||
|
is.isInt = false
|
||||||
|
is.strVal = v
|
||||||
|
return nil
|
||||||
|
case int64:
|
||||||
|
is.isInt = true
|
||||||
|
is.intVal = int(v)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &TomlTypeError{Value: val}
|
||||||
|
}
|
||||||
|
|
@ -10,17 +10,8 @@ func (ye *YamlTypeError) Error() string {
|
||||||
return ye.Node.Tag + " is not a valid type for this field"
|
return ye.Node.Tag + " is not a valid type for this field"
|
||||||
}
|
}
|
||||||
|
|
||||||
type IntOrString struct {
|
|
||||||
intVal int
|
|
||||||
strVal string
|
|
||||||
isInt bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func (is IntOrString) MarshalYAML() (any, error) {
|
func (is IntOrString) MarshalYAML() (any, error) {
|
||||||
if is.isInt {
|
return is.Value(), nil
|
||||||
return is.intVal, nil
|
|
||||||
}
|
|
||||||
return is.strVal, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (is *IntOrString) UnmarshalYAML(value *yaml.Node) error {
|
func (is *IntOrString) UnmarshalYAML(value *yaml.Node) error {
|
||||||
|
|
@ -36,10 +27,3 @@ func (is *IntOrString) UnmarshalYAML(value *yaml.Node) error {
|
||||||
|
|
||||||
return &YamlTypeError{Node: value}
|
return &YamlTypeError{Node: value}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (is IntOrString) IsZero() bool {
|
|
||||||
if is.isInt {
|
|
||||||
return is.intVal == 0
|
|
||||||
}
|
|
||||||
return is.strVal == ""
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue