package actions

import (
	"fmt"
)

type ActionLibrary struct {
	actions map[string]Action
}

func NewActionLibrary() *ActionLibrary {
	return &ActionLibrary{make(map[string]Action)}
}

func (al *ActionLibrary) Register(action Action) error {
	name := action.Name()
	if _, ok := al.actions[name]; ok {
		return fmt.Errorf("ActionLibrary.Register: action `%s` already existed", name)
	}
	al.actions[name] = action
	return nil
}

func (al *ActionLibrary) SafeRegister(action Action) {
	err := al.Register(action)
	if err != nil {
		panic(err)
	}
}

func (al *ActionLibrary) Invoke(name string, args ActionArgs) error {
	action, ok := al.actions[name]
	if !ok {
		return fmt.Errorf("ActionLibrary.Invoke: action `%s` not found", name)
	}
	return action.Invoke(args)
}

func (al *ActionLibrary) Get(name string) Action {
	return al.actions[name]
}
