listable.go 510 B

123456789101112131415161718192021222324252627
  1. package option
  2. import "encoding/json"
  3. type Listable[T comparable] []T
  4. func (l *Listable[T]) MarshalJSON() ([]byte, error) {
  5. arrayList := []T(*l)
  6. if len(arrayList) == 1 {
  7. return json.Marshal(arrayList[0])
  8. }
  9. return json.Marshal(arrayList)
  10. }
  11. func (l *Listable[T]) UnmarshalJSON(bytes []byte) error {
  12. err := json.Unmarshal(bytes, (*[]T)(l))
  13. if err == nil {
  14. return nil
  15. }
  16. var singleItem T
  17. err = json.Unmarshal(bytes, &singleItem)
  18. if err != nil {
  19. return err
  20. }
  21. *l = []T{singleItem}
  22. return nil
  23. }