]> git.lizzy.rs Git - micro.git/blob - internal/config/plugin.go
Allow any plugin to be enabled or disabled via settings
[micro.git] / internal / config / plugin.go
1 package config
2
3 import (
4         "errors"
5
6         lua "github.com/yuin/gopher-lua"
7         ulua "github.com/zyedidia/micro/internal/lua"
8 )
9
10 var ErrNoSuchFunction = errors.New("No such function exists")
11
12 // LoadAllPlugins loads all detected plugins (in runtime/plugins and ConfigDir/plugins)
13 func LoadAllPlugins() {
14         for _, p := range Plugins {
15                 p.Load()
16         }
17 }
18
19 // RunPluginFn runs a given function in all plugins
20 func RunPluginFn(fn string, args ...lua.LValue) error {
21         var reterr error
22         for _, p := range Plugins {
23                 if !p.IsEnabled() {
24                         continue
25                 }
26                 _, err := p.Call(fn, args...)
27                 if err != nil && err != ErrNoSuchFunction {
28                         reterr = errors.New("Plugin " + p.Name + ": " + err.Error())
29                 }
30         }
31         return reterr
32 }
33
34 type Plugin struct {
35         Name   string        // name of plugin
36         Info   RuntimeFile   // json file containing info
37         Srcs   []RuntimeFile // lua files
38         Loaded bool
39 }
40
41 func (p *Plugin) IsEnabled() bool {
42         if v, ok := GlobalSettings[p.Name]; ok {
43                 return v.(bool)
44         }
45         return true
46 }
47
48 var Plugins []*Plugin
49
50 func (p *Plugin) Load() error {
51         for _, f := range p.Srcs {
52                 if !p.IsEnabled() {
53                         return nil
54                 }
55                 dat, err := f.Data()
56                 if err != nil {
57                         return err
58                 }
59                 err = ulua.LoadFile(p.Name, f.Name(), dat)
60                 if err != nil {
61                         return err
62                 }
63                 p.Loaded = true
64                 if _, ok := GlobalSettings[p.Name]; !ok {
65                         AddOption(p.Name, true)
66                 }
67         }
68         return nil
69 }
70
71 func (p *Plugin) Call(fn string, args ...lua.LValue) (lua.LValue, error) {
72         plug := ulua.L.GetGlobal(p.Name)
73         luafn := ulua.L.GetField(plug, fn)
74         if luafn == lua.LNil {
75                 return nil, ErrNoSuchFunction
76         }
77         err := ulua.L.CallByParam(lua.P{
78                 Fn:      luafn,
79                 NRet:    1,
80                 Protect: true,
81         }, args...)
82         if err != nil {
83                 return nil, err
84         }
85         ret := ulua.L.Get(-1)
86         ulua.L.Pop(1)
87         return ret, nil
88 }