Files
config/value/helpers.go

111 lines
2.1 KiB
Go

package value
import (
"encoding/json"
"fmt"
"strconv"
"time"
"gitoa.ru/go-4devs/config"
)
func ParseDuration(raw string) (time.Duration, error) {
d, err := time.ParseDuration(raw)
if err != nil {
return 0, fmt.Errorf("%w: %w", config.ErrInvalidValue, err)
}
return d, nil
}
func ParseInt64(s string) (int64, error) {
i, err := strconv.ParseInt(s, 10, 64)
if err != nil {
return 0, fmt.Errorf("%w: %w", config.ErrInvalidValue, err)
}
return i, nil
}
func ParseUint(s string) (uint, error) {
i, err := strconv.ParseUint(s, 10, 64)
if err != nil {
return 0, fmt.Errorf("%w: %w", config.ErrInvalidValue, err)
}
return uint(i), nil
}
func Atoi(s string) (int, error) {
i, err := strconv.Atoi(s)
if err != nil {
return 0, fmt.Errorf("%w: %w", config.ErrInvalidValue, err)
}
return i, nil
}
func ParseTime(s string) (time.Time, error) {
i, err := time.Parse(time.RFC3339, s)
if err != nil {
return time.Time{}, fmt.Errorf("%w: %w", config.ErrInvalidValue, err)
}
return i, nil
}
func ParseFloat(s string) (float64, error) {
f, err := strconv.ParseFloat(s, 64)
if err != nil {
return 0, fmt.Errorf("%w: %w", config.ErrInvalidValue, err)
}
return f, nil
}
func ParseBool(s string) (bool, error) {
b, err := strconv.ParseBool(s)
if err != nil {
return false, fmt.Errorf("%w: %w", config.ErrInvalidValue, err)
}
return b, nil
}
func ParseUint64(s string) (uint64, error) {
i, err := strconv.ParseUint(s, 10, 64)
if err != nil {
return 0, fmt.Errorf("%w: %w", config.ErrInvalidValue, err)
}
return i, nil
}
func JUnmarshal(b []byte, v any) error {
if err := json.Unmarshal(b, v); err != nil {
return fmt.Errorf("%w: %w", config.ErrInvalidValue, err)
}
return nil
}
func JParse[T any](b []byte) (T, error) {
var data T
return data, JUnmarshal(b, &data)
}
func ParseSlice[T any](in []string, fn func(string) (T, error)) (config.Value, error) {
out := make([]T, 0, len(in))
for idx, one := range in {
data, err := fn(one)
if err != nil {
return nil, fmt.Errorf("parse[%T][%d]:%w", out, idx, err)
}
out = append(out, data)
}
return New(out), nil
}