You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

159 lines
2.3 KiB

4 years ago
package value
import (
"encoding/json"
"fmt"
"time"
"gitoa.ru/go-4devs/config"
)
var _ config.Value = (*Value)(nil)
type Value struct {
Val interface{}
}
func (s Value) Int() int {
v, _ := s.ParseInt()
return v
}
func (s Value) Int64() int64 {
v, _ := s.ParseInt64()
return v
}
func (s Value) Uint() uint {
v, _ := s.ParseUint()
return v
}
func (s Value) Uint64() uint64 {
v, _ := s.ParseUint64()
return v
}
func (s Value) Float64() float64 {
in, _ := s.ParseFloat64()
return in
}
func (s Value) String() string {
v, _ := s.ParseString()
return v
}
func (s Value) Bool() bool {
v, _ := s.ParseBool()
return v
}
func (s Value) Duration() time.Duration {
v, _ := s.ParseDuration()
return v
}
func (s Value) Raw() interface{} {
return s.Val
}
func (s Value) Time() time.Time {
v, _ := s.ParseTime()
return v
}
func (s Value) Unmarshal(target interface{}) error {
if v, ok := s.Raw().([]byte); ok {
err := json.Unmarshal(v, target)
if err != nil {
return fmt.Errorf("%w: %w", config.ErrInvalidValue, err)
4 years ago
}
return nil
}
return config.ErrInvalidValue
}
func (s Value) ParseInt() (int, error) {
if r, ok := s.Raw().(int); ok {
return r, nil
}
return 0, config.ErrInvalidValue
}
func (s Value) ParseInt64() (int64, error) {
if r, ok := s.Raw().(int64); ok {
return r, nil
}
return 0, config.ErrInvalidValue
}
func (s Value) ParseUint() (uint, error) {
if r, ok := s.Raw().(uint); ok {
return r, nil
}
return 0, config.ErrInvalidValue
}
func (s Value) ParseUint64() (uint64, error) {
if r, ok := s.Raw().(uint64); ok {
return r, nil
}
return 0, config.ErrInvalidValue
}
func (s Value) ParseFloat64() (float64, error) {
if r, ok := s.Raw().(float64); ok {
return r, nil
}
return 0, config.ErrInvalidValue
}
func (s Value) ParseString() (string, error) {
if r, ok := s.Raw().(string); ok {
return r, nil
}
return "", config.ErrInvalidValue
}
func (s Value) ParseBool() (bool, error) {
if b, ok := s.Raw().(bool); ok {
return b, nil
}
return false, config.ErrInvalidValue
}
func (s Value) ParseDuration() (time.Duration, error) {
if b, ok := s.Raw().(time.Duration); ok {
return b, nil
}
return 0, config.ErrInvalidValue
}
func (s Value) ParseTime() (time.Time, error) {
if b, ok := s.Raw().(time.Time); ok {
return b, nil
}
return time.Time{}, config.ErrInvalidValue
}