loader.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package conf
  2. import "encoding/json"
  3. type ConfigCreator func() interface{}
  4. type ConfigCreatorCache map[string]ConfigCreator
  5. func (v ConfigCreatorCache) RegisterCreator(id string, creator ConfigCreator) error {
  6. if _, found := v[id]; found {
  7. return newError(id, " already registered.").AtError()
  8. }
  9. v[id] = creator
  10. return nil
  11. }
  12. func (v ConfigCreatorCache) CreateConfig(id string) (interface{}, error) {
  13. creator, found := v[id]
  14. if !found {
  15. return nil, newError("unknown config id: ", id)
  16. }
  17. return creator(), nil
  18. }
  19. type JSONConfigLoader struct {
  20. cache ConfigCreatorCache
  21. idKey string
  22. configKey string
  23. }
  24. func NewJSONConfigLoader(cache ConfigCreatorCache, idKey string, configKey string) *JSONConfigLoader {
  25. return &JSONConfigLoader{
  26. idKey: idKey,
  27. configKey: configKey,
  28. cache: cache,
  29. }
  30. }
  31. func (v *JSONConfigLoader) LoadWithID(raw []byte, id string) (interface{}, error) {
  32. creator, found := v.cache[id]
  33. if !found {
  34. return nil, newError("unknown config id: ", id).AtError()
  35. }
  36. config := creator()
  37. if err := json.Unmarshal(raw, config); err != nil {
  38. return nil, err
  39. }
  40. return config, nil
  41. }
  42. func (v *JSONConfigLoader) Load(raw []byte) (interface{}, string, error) {
  43. var obj map[string]json.RawMessage
  44. if err := json.Unmarshal(raw, &obj); err != nil {
  45. return nil, "", err
  46. }
  47. rawID, found := obj[v.idKey]
  48. if !found {
  49. return nil, "", newError(v.idKey, " not found in JSON context").AtError()
  50. }
  51. var id string
  52. if err := json.Unmarshal(rawID, &id); err != nil {
  53. return nil, "", err
  54. }
  55. rawConfig := json.RawMessage(raw)
  56. if len(v.configKey) > 0 {
  57. configValue, found := obj[v.configKey]
  58. if !found {
  59. return nil, "", newError(v.configKey, " not found in JSON content").AtError()
  60. }
  61. rawConfig = configValue
  62. }
  63. config, err := v.LoadWithID([]byte(rawConfig), id)
  64. if err != nil {
  65. return nil, id, err
  66. }
  67. return config, id, nil
  68. }