12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- package registry
- import (
- "reflect"
- )
- // Registry function registry
- type Registry struct {
- data map[string]*Entry
- }
- // New creates a new registry
- func New() *Registry {
- return &Registry{map[string]*Entry{}}
- }
- //Register should be a func only register
- func (r *Registry) Register(name string, v interface{}) *Entry {
- e := NewEntry(r, v)
- if e.err != nil {
- return e
- }
- // build description here
- r.data[name] = e
- return e
- }
- // Get an entry
- func (r *Registry) Get(name string, params ...interface{}) (interface{}, error) {
- e, ok := r.data[name]
- if !ok {
- return nil, ErrNotFound
- }
- v := e.fn
- // We already know this is a function
- // and that returns 1 or more values
- vtyp := reflect.TypeOf(v)
- if vtyp.Out(0).Kind() != reflect.Func {
- return v, nil
- }
- // Constructor
- fparam := make([]reflect.Value, len(params))
- for i := range params {
- fparam[i] = reflect.ValueOf(params[i])
- }
- // Call the func and return the thing
- v = reflect.ValueOf(v).Call(fparam)[0].Interface()
- return v, nil
- }
- // Entry fetches entries from the register
- func (r *Registry) Entry(name string) (*Entry, error) {
- e, ok := r.data[name]
- if !ok {
- return nil, ErrNotFound
- }
- return e, nil
- }
- //Describe named fn
- // Descriptions Description list
- func (r *Registry) Descriptions() (map[string]Description, error) {
- ret := map[string]Description{}
- for k, e := range r.data {
- ret[k] = *e.Description
- }
- return ret, nil
- }
|