* begin backend plugin wip * flesh out rpcplugin. everything done except for minor supervisor stubs * done with basic plugin infrastructure * simplify tests * remove unused test lines
71 строка
1.4 KiB
Go
71 строка
1.4 KiB
Go
package plugin
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"gopkg.in/yaml.v2"
|
|
)
|
|
|
|
type Manifest struct {
|
|
Id string `json:"id" yaml:"id"`
|
|
Backend *ManifestBackend `json:"backend,omitempty" yaml:"backend,omitempty"`
|
|
}
|
|
|
|
type ManifestBackend struct {
|
|
Executable string `json:"executable" yaml:"executable"`
|
|
}
|
|
|
|
// FindManifest will find and parse the manifest in a given directory.
|
|
//
|
|
// In all cases other than a does-not-exist error, path is set to the path of the manifest file that was
|
|
// found.
|
|
//
|
|
// Manifests are JSON or YAML files named plugin.json, plugin.yaml, or plugin.yml.
|
|
func FindManifest(dir string) (manifest *Manifest, path string, err error) {
|
|
for _, name := range []string{"plugin.yml", "plugin.yaml"} {
|
|
path = filepath.Join(dir, name)
|
|
f, ferr := os.Open(path)
|
|
if ferr != nil {
|
|
if !os.IsNotExist(ferr) {
|
|
err = ferr
|
|
return
|
|
}
|
|
continue
|
|
}
|
|
b, ioerr := ioutil.ReadAll(f)
|
|
f.Close()
|
|
if ioerr != nil {
|
|
err = ioerr
|
|
return
|
|
}
|
|
var parsed Manifest
|
|
err = yaml.Unmarshal(b, &parsed)
|
|
if err != nil {
|
|
return
|
|
}
|
|
manifest = &parsed
|
|
return
|
|
}
|
|
|
|
path = filepath.Join(dir, "plugin.json")
|
|
f, ferr := os.Open(path)
|
|
if ferr != nil {
|
|
if os.IsNotExist(ferr) {
|
|
path = ""
|
|
}
|
|
err = ferr
|
|
return
|
|
}
|
|
defer f.Close()
|
|
var parsed Manifest
|
|
err = json.NewDecoder(f).Decode(&parsed)
|
|
if err != nil {
|
|
return
|
|
}
|
|
manifest = &parsed
|
|
return
|
|
}
|