extractor.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package shared
  2. import (
  3. "errors"
  4. "net/url"
  5. "time"
  6. )
  7. // TODO throughout this file: attach the problematic object to the error
  8. type JSON = map[string]any
  9. func Get[T any](o JSON, key string) (T, error) {
  10. var zero T
  11. if value, ok := o[key]; !ok {
  12. return zero, errors.New("Object does not contain key " + key)
  13. } else if value, ok := value.(T); !ok {
  14. return zero, errors.New("Key " + key + " is not of the desired type")
  15. } else {
  16. return value, nil
  17. }
  18. }
  19. // some fields have "natural language values" meaning that I should check
  20. // `contentMap[language]`, followed by `content`, followed by `contentMap["und"]`
  21. // to find the content of the post
  22. // https://www.w3.org/TR/activitystreams-core/#naturalLanguageValues
  23. func GetNatural(o JSON, key string, language string) (string, error) {
  24. values, valuesErr := Get[JSON](o, key+"Map")
  25. if valuesErr == nil {
  26. if value, err := Get[string](values, language); err == nil {
  27. return value, nil
  28. }
  29. }
  30. if value, err := Get[string](o, key); err == nil {
  31. return value, nil
  32. }
  33. if valuesErr == nil {
  34. if value, err := Get[string](values, "und"); err == nil {
  35. return value, nil
  36. }
  37. }
  38. return "", errors.New("Natural language key " + key + " is not correctly present in object")
  39. }
  40. // there may be a nice way to extract this logic out but for now it doesn't matter
  41. func GetTime(o JSON, key string) (time.Time, error) {
  42. if value, err := Get[string](o, key); err != nil {
  43. return time.Time{}, err
  44. } else {
  45. return time.Parse(time.RFC3339, value)
  46. }
  47. }
  48. func GetURL(o JSON, key string) (*url.URL, error) {
  49. if value, err := Get[string](o, key); err != nil {
  50. return nil, err
  51. } else {
  52. return url.Parse(value)
  53. }
  54. }