| package cachex | |
| import ( | |
| "encoding/json" | |
| "fmt" | |
| "strconv" | |
| "strings" | |
| ) | |
| type ValueCodec[V any] interface { | |
| Encode(v V) (string, error) | |
| Decode(s string) (V, error) | |
| } | |
| type IntCodec struct{} | |
| func (c IntCodec) Encode(v int) (string, error) { | |
| return strconv.Itoa(v), nil | |
| } | |
| func (c IntCodec) Decode(s string) (int, error) { | |
| s = strings.TrimSpace(s) | |
| if s == "" { | |
| return 0, fmt.Errorf("empty int value") | |
| } | |
| return strconv.Atoi(s) | |
| } | |
| type StringCodec struct{} | |
| func (c StringCodec) Encode(v string) (string, error) { return v, nil } | |
| func (c StringCodec) Decode(s string) (string, error) { return s, nil } | |
| type JSONCodec[V any] struct{} | |
| func (c JSONCodec[V]) Encode(v V) (string, error) { | |
| b, err := json.Marshal(v) | |
| if err != nil { | |
| return "", err | |
| } | |
| return string(b), nil | |
| } | |
| func (c JSONCodec[V]) Decode(s string) (V, error) { | |
| var v V | |
| if strings.TrimSpace(s) == "" { | |
| return v, fmt.Errorf("empty json value") | |
| } | |
| if err := json.Unmarshal([]byte(s), &v); err != nil { | |
| return v, err | |
| } | |
| return v, nil | |
| } | |