59 lines
1.3 KiB
Go
59 lines
1.3 KiB
Go
package app
|
|
|
|
import (
|
|
"errors"
|
|
"owl-blogs/domain/model"
|
|
"reflect"
|
|
)
|
|
|
|
type EntryTypeRegistry struct {
|
|
types map[string]model.Entry
|
|
}
|
|
|
|
func NewEntryTypeRegistry() *EntryTypeRegistry {
|
|
return &EntryTypeRegistry{types: map[string]model.Entry{}}
|
|
}
|
|
|
|
func (r *EntryTypeRegistry) entryType(entry model.Entry) string {
|
|
return reflect.TypeOf(entry).Elem().Name()
|
|
}
|
|
|
|
func (r *EntryTypeRegistry) Register(entry model.Entry) error {
|
|
t := r.entryType(entry)
|
|
if _, ok := r.types[t]; ok {
|
|
return errors.New("entry type already registered")
|
|
}
|
|
r.types[t] = entry
|
|
return nil
|
|
}
|
|
|
|
func (r *EntryTypeRegistry) Types() []model.Entry {
|
|
types := []model.Entry{}
|
|
for _, t := range r.types {
|
|
types = append(types, t)
|
|
}
|
|
return types
|
|
}
|
|
|
|
func (r *EntryTypeRegistry) TypeName(entry model.Entry) (string, error) {
|
|
t := r.entryType(entry)
|
|
if _, ok := r.types[t]; !ok {
|
|
return "", errors.New("entry type not registered")
|
|
}
|
|
return t, nil
|
|
}
|
|
|
|
func (r *EntryTypeRegistry) Type(name string) (model.Entry, error) {
|
|
if _, ok := r.types[name]; !ok {
|
|
return nil, errors.New("entry type not registered")
|
|
}
|
|
|
|
val := reflect.ValueOf(r.types[name])
|
|
if val.Kind() == reflect.Ptr {
|
|
val = reflect.Indirect(val)
|
|
}
|
|
newEntry := reflect.New(val.Type()).Interface().(model.Entry)
|
|
|
|
return newEntry, nil
|
|
}
|