You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

serde.go 841B

12345678910111213141516171819202122232425262728293031323334353637
  1. // Copyright (c) 2022 Shivaram Lingamneni
  2. // released under the MIT license
  3. package irc
  4. import (
  5. "strconv"
  6. "github.com/ergochat/ergo/irc/datastore"
  7. "github.com/ergochat/ergo/irc/logger"
  8. )
  9. type Serializable interface {
  10. Serialize() ([]byte, error)
  11. Deserialize([]byte) error
  12. }
  13. func FetchAndDeserializeAll[T any, C interface {
  14. *T
  15. Serializable
  16. }](table datastore.Table, dstore datastore.Datastore, log *logger.Manager) (result []T, err error) {
  17. rawRecords, err := dstore.GetAll(table)
  18. if err != nil {
  19. return
  20. }
  21. result = make([]T, len(rawRecords))
  22. pos := 0
  23. for _, record := range rawRecords {
  24. err := C(&result[pos]).Deserialize(record.Value)
  25. if err != nil {
  26. log.Error("internal", "deserialization error", strconv.Itoa(int(table)), record.UUID.String(), err.Error())
  27. continue
  28. }
  29. pos++
  30. }
  31. return result[:pos], nil
  32. }