sharded-gotify/plugin/compat/wrap.go

36 lines
1.0 KiB
Go

package compat
import (
"errors"
"fmt"
"plugin"
papiv1 "github.com/gotify/plugin-api"
)
// Wrap wraps around a raw go plugin to provide typesafe access.
func Wrap(p *plugin.Plugin) (Plugin, error) {
getInfoHandle, err := p.Lookup("GetGotifyPluginInfo")
if err != nil {
return nil, errors.New("missing GetGotifyPluginInfo symbol")
}
switch getInfoHandle := getInfoHandle.(type) {
case func() papiv1.Info:
v1 := PluginV1{}
v1.Info = getInfoHandle()
newInstanceHandle, err := p.Lookup("NewGotifyPluginInstance")
if err != nil {
return nil, errors.New("missing NewGotifyPluginInstance symbol")
}
constructor, ok := newInstanceHandle.(func(ctx papiv1.UserContext) papiv1.Plugin)
if !ok {
return nil, fmt.Errorf("NewGotifyPluginInstance signature mismatch, func(ctx plugin.UserContext) plugin.Plugin expected, got %T", newInstanceHandle)
}
v1.Constructor = constructor
return v1, nil
default:
return nil, fmt.Errorf("unknown plugin version (unrecogninzed GetGotifyPluginInfo signature %T)", getInfoHandle)
}
}