mirror of
				https://github.com/TeaOSLab/EdgeNode.git
				synced 2025-11-04 15:51:54 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			82 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2024 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn .
 | 
						|
 | 
						|
package kvstore
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/binary"
 | 
						|
	"github.com/iwind/TeaGo/types"
 | 
						|
	"golang.org/x/exp/constraints"
 | 
						|
	"strconv"
 | 
						|
)
 | 
						|
 | 
						|
type IntValueEncoder[T constraints.Integer] struct {
 | 
						|
}
 | 
						|
 | 
						|
func NewIntValueEncoder[T constraints.Integer]() *IntValueEncoder[T] {
 | 
						|
	return &IntValueEncoder[T]{}
 | 
						|
}
 | 
						|
 | 
						|
func (this *IntValueEncoder[T]) Encode(value T) (data []byte, err error) {
 | 
						|
	switch v := any(value).(type) {
 | 
						|
	case int8, int16, int32, int, uint:
 | 
						|
		data = []byte(types.String(v))
 | 
						|
	case int64:
 | 
						|
		data = []byte(strconv.FormatInt(v, 16))
 | 
						|
	case uint8:
 | 
						|
		return []byte{v}, nil
 | 
						|
	case uint16:
 | 
						|
		data = make([]byte, 2)
 | 
						|
		binary.BigEndian.PutUint16(data, v)
 | 
						|
	case uint32:
 | 
						|
		data = make([]byte, 4)
 | 
						|
		binary.BigEndian.PutUint32(data, v)
 | 
						|
	case uint64:
 | 
						|
		data = make([]byte, 8)
 | 
						|
		binary.BigEndian.PutUint64(data, v)
 | 
						|
	}
 | 
						|
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
func (this *IntValueEncoder[T]) EncodeField(value T, fieldName string) ([]byte, error) {
 | 
						|
	_ = fieldName
 | 
						|
	return this.Encode(value)
 | 
						|
}
 | 
						|
 | 
						|
func (this *IntValueEncoder[T]) Decode(valueData []byte) (value T, err error) {
 | 
						|
	switch any(value).(type) {
 | 
						|
	case int8:
 | 
						|
		value = T(types.Int8(string(valueData)))
 | 
						|
	case int16:
 | 
						|
		value = T(types.Int16(string(valueData)))
 | 
						|
	case int32:
 | 
						|
		value = T(types.Int32(string(valueData)))
 | 
						|
	case int64:
 | 
						|
		int64Value, _ := strconv.ParseInt(string(valueData), 16, 64)
 | 
						|
		value = T(int64Value)
 | 
						|
	case int:
 | 
						|
		value = T(types.Int(string(valueData)))
 | 
						|
	case uint:
 | 
						|
		value = T(types.Uint(string(valueData)))
 | 
						|
	case uint8:
 | 
						|
		if len(valueData) == 1 {
 | 
						|
			value = T(valueData[0])
 | 
						|
		}
 | 
						|
	case uint16:
 | 
						|
		if len(valueData) == 2 {
 | 
						|
			value = T(binary.BigEndian.Uint16(valueData))
 | 
						|
		}
 | 
						|
	case uint32:
 | 
						|
		if len(valueData) == 4 {
 | 
						|
			value = T(binary.BigEndian.Uint32(valueData))
 | 
						|
		}
 | 
						|
	case uint64:
 | 
						|
		if len(valueData) == 8 {
 | 
						|
			value = T(binary.BigEndian.Uint64(valueData))
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return
 | 
						|
}
 | 
						|
 |