| 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 |
| } |
|
|