registry.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package registry
  2. import (
  3. "reflect"
  4. )
  5. // Registry function registry
  6. type Registry struct {
  7. data map[string]*Entry
  8. }
  9. // New creates a new registry
  10. func New() *Registry {
  11. return &Registry{map[string]*Entry{}}
  12. }
  13. //Register should be a func only register
  14. func (r *Registry) Register(name string, v interface{}) *Entry {
  15. e := NewEntry(r, v)
  16. if e.err != nil {
  17. return e
  18. }
  19. // build description here
  20. r.data[name] = e
  21. return e
  22. }
  23. // Get an entry
  24. func (r *Registry) Get(name string, params ...interface{}) (interface{}, error) {
  25. e, ok := r.data[name]
  26. if !ok {
  27. return nil, ErrNotFound
  28. }
  29. v := e.fn
  30. // We already know this is a function
  31. // and that returns 1 or more values
  32. vtyp := reflect.TypeOf(v)
  33. if vtyp.Out(0).Kind() != reflect.Func {
  34. return v, nil
  35. }
  36. // Constructor
  37. fparam := make([]reflect.Value, len(params))
  38. for i := range params {
  39. fparam[i] = reflect.ValueOf(params[i])
  40. }
  41. // Call the func and return the thing
  42. v = reflect.ValueOf(v).Call(fparam)[0].Interface()
  43. return v, nil
  44. }
  45. // Entry fetches entries from the register
  46. func (r *Registry) Entry(name string) (*Entry, error) {
  47. e, ok := r.data[name]
  48. if !ok {
  49. return nil, ErrNotFound
  50. }
  51. return e, nil
  52. }
  53. //Describe named fn
  54. // Descriptions Description list
  55. func (r *Registry) Descriptions() (map[string]Description, error) {
  56. ret := map[string]Description{}
  57. for k, e := range r.data {
  58. ret[k] = *e.Description
  59. }
  60. return ret, nil
  61. }