1
0
mirror of https://github.com/gogf/gf.git synced 2025-04-05 03:05:05 +08:00
gf/util/gconv/gconv.go

171 lines
5.6 KiB
Go

// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://github.com/gogf/gf.
// Package gconv implements powerful and convenient converting functionality for any types of variables.
//
// This package should keep much fewer dependencies with other packages.
package gconv
import (
"reflect"
"time"
"github.com/gogf/gf/v2/os/gtime"
"github.com/gogf/gf/v2/util/gconv/internal/converter"
"github.com/gogf/gf/v2/util/gconv/internal/localinterface"
"github.com/gogf/gf/v2/util/gconv/internal/structcache"
)
// Converter is the manager for type converting.
type Converter interface {
ConverterForConvert
ConverterForRegister
ConverterForInt
ConverterForUint
ConverterForTime
ConverterForFloat
ConverterForMap
ConverterForSlice
ConverterForStruct
ConverterForBasic
}
// ConverterForBasic is the basic converting interface.
type ConverterForBasic interface {
Scan(srcValue, dstPointer any, option ...ScanOption) (err error)
String(any any) (string, error)
Bool(any any) (bool, error)
Rune(any any) (rune, error)
}
// ConverterForTime is the converting interface for time.
type ConverterForTime interface {
Time(v any, format ...string) (time.Time, error)
Duration(v any) (time.Duration, error)
GTime(v any, format ...string) (*gtime.Time, error)
}
// ConverterForInt is the converting interface for integer.
type ConverterForInt interface {
Int(v any) (int, error)
Int8(v any) (int8, error)
Int16(v any) (int16, error)
Int32(v any) (int32, error)
Int64(v any) (int64, error)
}
// ConverterForUint is the converting interface for unsigned integer.
type ConverterForUint interface {
Uint(v any) (uint, error)
Uint8(v any) (uint8, error)
Uint16(v any) (uint16, error)
Uint32(v any) (uint32, error)
Uint64(v any) (uint64, error)
}
// ConverterForFloat is the converting interface for float.
type ConverterForFloat interface {
Float32(v any) (float32, error)
Float64(v any) (float64, error)
}
// ConverterForMap is the converting interface for map.
type ConverterForMap interface {
Map(v any, option ...MapOption) (map[string]any, error)
MapStrStr(v any, option ...MapOption) (map[string]string, error)
}
// ConverterForSlice is the converting interface for slice.
type ConverterForSlice interface {
Bytes(v any) ([]byte, error)
Runes(v any) ([]rune, error)
SliceAny(v any, option ...SliceOption) ([]any, error)
SliceFloat32(v any, option ...SliceOption) ([]float32, error)
SliceFloat64(v any, option ...SliceOption) ([]float64, error)
SliceInt(v any, option ...SliceOption) ([]int, error)
SliceInt32(v any, option ...SliceOption) ([]int32, error)
SliceInt64(v any, option ...SliceOption) ([]int64, error)
SliceUint(v any, option ...SliceOption) ([]uint, error)
SliceUint32(v any, option ...SliceOption) ([]uint32, error)
SliceUint64(v any, option ...SliceOption) ([]uint64, error)
SliceStr(v any, option ...SliceOption) ([]string, error)
SliceMap(v any, option ...SliceMapOption) ([]map[string]any, error)
}
// ConverterForStruct is the converting interface for struct.
type ConverterForStruct interface {
Struct(params, pointer any, option ...StructOption) (err error)
Structs(params, pointer any, option ...StructsOption) (err error)
}
// ConverterForConvert is the converting interface for custom converting.
type ConverterForConvert interface {
ConvertWithRefer(fromValue, referValue any, option ...ConvertOption) (any, error)
ConvertWithTypeName(fromValue any, toTypeName string, option ...ConvertOption) (any, error)
}
// ConverterForRegister is the converting interface for custom converter registration.
type ConverterForRegister interface {
RegisterTypeConverterFunc(f any) error
RegisterAnyConverterFunc(f AnyConvertFunc, types ...reflect.Type)
}
type (
// AnyConvertFunc is the function type for converting any to specified type.
AnyConvertFunc = structcache.AnyConvertFunc
// MapOption specifies the option for map converting.
MapOption = converter.MapOption
// SliceOption is the option for Slice type converting.
SliceOption = converter.SliceOption
// SliceMapOption is the option for SliceMap function.
SliceMapOption = converter.SliceMapOption
// ScanOption is the option for the Scan function.
ScanOption = converter.ScanOption
// StructOption is the option for Struct converting.
StructOption = converter.StructOption
// StructsOption is the option for Structs function.
StructsOption = converter.StructsOption
// ConvertOption is the option for converting.
ConvertOption = converter.ConvertOption
)
// IUnmarshalValue is the interface for custom defined types customizing value assignment.
// Note that only pointer can implement interface IUnmarshalValue.
type IUnmarshalValue = localinterface.IUnmarshalValue
var (
// defaultConverter is the default management object converting.
defaultConverter = converter.NewConverter()
)
// NewConverter creates and returns management object for type converting.
func NewConverter() Converter {
return converter.NewConverter()
}
// RegisterConverter registers custom converter.
// Deprecated: use RegisterTypeConverterFunc instead for clear
func RegisterConverter(fn any) (err error) {
return RegisterTypeConverterFunc(fn)
}
// RegisterTypeConverterFunc registers custom converter.
func RegisterTypeConverterFunc(fn any) (err error) {
return defaultConverter.RegisterTypeConverterFunc(fn)
}
// RegisterAnyConverterFunc registers custom type converting function for specified type.
func RegisterAnyConverterFunc(f AnyConvertFunc, types ...reflect.Type) {
defaultConverter.RegisterAnyConverterFunc(f, types...)
}