registry.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. r := &R{map[string]*Entry{}}
  24. // create a base function here?
  25. return r
  26. }
  27. // Clone an existing registry
  28. func (r *R) Clone() *R {
  29. newR := &R{map[string]*Entry{}}
  30. for k, v := range r.data {
  31. newR.data[k] = v
  32. }
  33. return newR
  34. }
  35. // Add unnamed function
  36. func (r *R) Add(fns ...interface{}) EDescriber {
  37. b := EDescriber{}
  38. for _, fn := range fns {
  39. if reflect.TypeOf(fn).Kind() != reflect.Func {
  40. return nil
  41. }
  42. // Automatic naming
  43. name := runtime.FuncForPC(reflect.ValueOf(fn).Pointer()).Name()
  44. name = path.Ext(name)[1:]
  45. b = append(b, r.Register(name, fn))
  46. }
  47. return b
  48. }
  49. //Register should be a func only register
  50. func (r *R) Register(name string, v interface{}) *Entry {
  51. e := NewEntry(r, v)
  52. if e.err != nil {
  53. return e
  54. }
  55. r.data[name] = e
  56. return e
  57. }
  58. // Get an entry
  59. func (r *R) Get(name string, params ...interface{}) (interface{}, error) {
  60. e, ok := r.data[name]
  61. if !ok {
  62. return nil, ErrNotFound
  63. }
  64. v := e.fn
  65. // We already know this is a function
  66. // and that returns 1 or more values
  67. vtyp := reflect.TypeOf(v)
  68. if vtyp.Out(0).Kind() != reflect.Func {
  69. return v, nil
  70. }
  71. // Constructor
  72. fparam := make([]reflect.Value, len(params))
  73. for i := range params {
  74. fparam[i] = reflect.ValueOf(params[i])
  75. }
  76. // Call the func and return the thing
  77. v = reflect.ValueOf(v).Call(fparam)[0].Interface()
  78. return v, nil
  79. }
  80. // Entry fetches entries from the register
  81. func (r *R) Entry(name string) (*Entry, error) {
  82. e, ok := r.data[name]
  83. if !ok {
  84. return nil, ErrNotFound
  85. }
  86. return e, nil
  87. }
  88. //Describe named fn
  89. // Descriptions Description list
  90. func (r *R) Descriptions() (map[string]Description, error) {
  91. ret := map[string]Description{}
  92. for k, e := range r.data {
  93. ret[k] = *e.Description
  94. }
  95. return ret, nil
  96. }