gosuki/modules/modules.go
2023-02-08 00:19:43 +01:00

89 lines
2.0 KiB
Go

// Modules allow gomark to be extended in the future.
// This file should live on it's own package or on the core pacakge
// The goal is to allow a generic interface Module that would allow anything to
// register as a Gomark module.
//
// Browsers would need to register as gomark Module and as Browser interfaces
package modules
import "errors"
var (
registeredBrowsers []BrowserModule
registeredModules []Module
)
// Every new module needs to register as a Module using this interface
type Module interface {
ModInfo() ModInfo
}
// browser modules need to implement Browser interface
type BrowserModule interface {
Browser
Module
}
// Information related to the browser module
type ModInfo struct {
ID ModID // Id of this module
// New returns a pointer to a new instance of a gomark module.
// Browser modules MUST implement this method.
New func() Module
}
type ModID string
func RegisterBrowser(browserMod BrowserModule) {
if err := verifyModule(browserMod); err != nil {
panic(err)
}
registeredBrowsers = append(registeredBrowsers, browserMod)
// A browser module is also a module
registeredModules = append(registeredModules, browserMod)
}
func verifyModule(module Module) error {
var err error
mod := module.ModInfo()
if mod.ID == "" {
err = errors.New("gomark module ID is missing")
}
if mod.New == nil {
err = errors.New("missing ModInfo.New")
}
if val := mod.New(); val == nil {
err = errors.New("ModInfo.New must return a non-nil module instance")
}
return err
}
func RegisterModule(module Module) {
// do not register browser modules here
_, bMod := module.(BrowserModule)
if bMod {
panic("use RegisterBrowser for browser modules")
}
if err := verifyModule(module); err != nil {
panic(err)
}
//TODO: Register by ID
registeredModules = append(registeredModules, module)
}
// Returns a list of registerd browser modules
func GetModules() []Module {
return registeredModules
}
func GetBrowserModules() []BrowserModule {
return registeredBrowsers
}