registry.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package registry
  2. import (
  3. "path"
  4. "reflect"
  5. "runtime"
  6. )
  7. // Global
  8. var (
  9. Global = New()
  10. Register = Global.Register
  11. Descriptions = Global.Descriptions
  12. GetEntry = Global.Entry
  13. Add = Global.Add
  14. )
  15. // M Alias for map[string]interface{}
  16. type M = map[string]interface{}
  17. // R the function registry
  18. type R struct {
  19. data map[string]*Entry
  20. }
  21. // New creates a new registry
  22. func New() *R {
  23. return &R{map[string]*Entry{}}
  24. }
  25. // Clone an existing registry
  26. func (r *R) Clone() *R {
  27. newR := &R{map[string]*Entry{}}
  28. for k, v := range r.data {
  29. newR.data[k] = v
  30. }
  31. return newR
  32. }
  33. // Add unnamed function
  34. func (r *R) Add(fns ...interface{}) EntryBatch {
  35. b := EntryBatch{}
  36. for _, fn := range fns {
  37. if reflect.TypeOf(fn).Kind() != reflect.Func {
  38. return nil
  39. }
  40. // Automatic naming
  41. name := runtime.FuncForPC(reflect.ValueOf(fn).Pointer()).Name()
  42. name = path.Ext(name)[1:]
  43. b = append(b, r.Register(name, fn))
  44. }
  45. return b
  46. }
  47. //Register should be a func only register
  48. func (r *R) Register(name string, v interface{}) *Entry {
  49. e := NewEntry(r, v)
  50. if e.err != nil {
  51. return e
  52. }
  53. r.data[name] = e
  54. return e
  55. }
  56. // Get an entry
  57. func (r *R) Get(name string, params ...interface{}) (interface{}, error) {
  58. e, ok := r.data[name]
  59. if !ok {
  60. return nil, ErrNotFound
  61. }
  62. v := e.fn
  63. // We already know this is a function
  64. // and that returns 1 or more values
  65. vtyp := reflect.TypeOf(v)
  66. if vtyp.Out(0).Kind() != reflect.Func {
  67. return v, nil
  68. }
  69. // Constructor
  70. fparam := make([]reflect.Value, len(params))
  71. for i := range params {
  72. fparam[i] = reflect.ValueOf(params[i])
  73. }
  74. // Call the func and return the thing
  75. v = reflect.ValueOf(v).Call(fparam)[0].Interface()
  76. return v, nil
  77. }
  78. // Entry fetches entries from the register
  79. func (r *R) Entry(name string) (*Entry, error) {
  80. e, ok := r.data[name]
  81. if !ok {
  82. return nil, ErrNotFound
  83. }
  84. return e, nil
  85. }
  86. //Describe named fn
  87. // Descriptions Description list
  88. func (r *R) Descriptions() (map[string]Description, error) {
  89. ret := map[string]Description{}
  90. for k, e := range r.data {
  91. ret[k] = *e.Description
  92. }
  93. return ret, nil
  94. }