36 lines
1.0 KiB
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)
|
|
}
|
|
}
|