45 lines
		
	
	
	
		
			885 B
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			45 lines
		
	
	
	
		
			885 B
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package tools | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"bytes" | ||
|  | 	"encoding/json" | ||
|  | 	"fmt" | ||
|  | 	"strconv" | ||
|  | 	"time" | ||
|  | ) | ||
|  | 
 | ||
|  | func WriteValue(buff *bytes.Buffer, val any) (n int, err error) { | ||
|  | 	switch v := val.(type) { | ||
|  | 	default: | ||
|  | 		err = fmt.Errorf("Unsupported type %T", v) | ||
|  | 	case nil: | ||
|  | 		return | ||
|  | 	case string: | ||
|  | 		return buff.WriteString(v) | ||
|  | 	case int: | ||
|  | 		return buff.WriteString(strconv.Itoa(v)) | ||
|  | 	case int64: | ||
|  | 		return buff.WriteString(strconv.FormatInt(v, 10)) | ||
|  | 	case float64: | ||
|  | 		return buff.WriteString(strconv.FormatFloat(v, 'f', -1, 64)) | ||
|  | 	case json.Number: | ||
|  | 		return buff.WriteString(v.String()) | ||
|  | 	case json.RawMessage: | ||
|  | 		return buff.Write(v) | ||
|  | 	case []byte: | ||
|  | 		return buff.Write(v) | ||
|  | 	case byte: | ||
|  | 		err = buff.WriteByte(v) | ||
|  | 		if err == nil { | ||
|  | 			n = 1 | ||
|  | 		} | ||
|  | 	case rune: | ||
|  | 		return buff.WriteString(string(v)) | ||
|  | 	case bool: | ||
|  | 		return buff.WriteString(strconv.FormatBool(v)) | ||
|  | 	case time.Time: | ||
|  | 		return buff.WriteString(v.Format(time.RFC3339)) | ||
|  | 	} | ||
|  | 	return | ||
|  | } |