| 
									
										
										
										
											2024-03-03 13:56:48 -06:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2024-03-10 15:49:36 -05:00
										 |  |  | 	case []any: | 
					
						
							|  |  |  | 		var o []byte | 
					
						
							|  |  |  | 		o, err = json.Marshal(v) | 
					
						
							|  |  |  | 		if err == nil { | 
					
						
							|  |  |  | 			return buff.Write(o) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	case map[string]any: | 
					
						
							|  |  |  | 		var o []byte | 
					
						
							|  |  |  | 		o, err = json.Marshal(v) | 
					
						
							|  |  |  | 		if err == nil { | 
					
						
							|  |  |  | 			return buff.Write(o) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2024-03-03 13:56:48 -06:00
										 |  |  | 	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 | 
					
						
							|  |  |  | } |