]> git.lizzy.rs Git - micro.git/blobdiff - internal/config/plugin.go
better top
[micro.git] / internal / config / plugin.go
index 8cd933ac15e3bc34fd19325b519134693ab14fcc..9dceb60b04e679761f184809b019c3d7c4a82010 100644 (file)
@@ -2,11 +2,13 @@ package config
 
 import (
        "errors"
+       "log"
 
        lua "github.com/yuin/gopher-lua"
        ulua "github.com/zyedidia/micro/internal/lua"
 )
 
+// ErrNoSuchFunction is returned when Call is executed on a function that does not exist
 var ErrNoSuchFunction = errors.New("No such function exists")
 
 // LoadAllPlugins loads all detected plugins (in runtime/plugins and ConfigDir/plugins)
@@ -55,15 +57,14 @@ func RunPluginFnBool(fn string, args ...lua.LValue) (bool, error) {
                        reterr = errors.New("Plugin " + p.Name + ": " + err.Error())
                        continue
                }
-               if v, ok := val.(lua.LBool); !ok {
-                       reterr = errors.New(p.Name + "." + fn + " should return a boolean")
-               } else {
+               if v, ok := val.(lua.LBool); ok {
                        retbool = retbool && bool(v)
                }
        }
        return retbool, reterr
 }
 
+// Plugin stores information about the source files/info for a plugin
 type Plugin struct {
        DirName string        // name of plugin folder
        Name    string        // name of plugin
@@ -73,6 +74,7 @@ type Plugin struct {
        Default bool // pre-installed plugin
 }
 
+// IsEnabled returns if a plugin is enabled
 func (p *Plugin) IsEnabled() bool {
        if v, ok := GlobalSettings[p.Name]; ok {
                return v.(bool) && p.Loaded
@@ -80,13 +82,15 @@ func (p *Plugin) IsEnabled() bool {
        return true
 }
 
+// Plugins is a list of all detected plugins (enabled or disabled)
 var Plugins []*Plugin
 
+// Load creates an option for the plugin and runs all source files
 func (p *Plugin) Load() error {
+       if v, ok := GlobalSettings[p.Name]; ok && !v.(bool) {
+               return nil
+       }
        for _, f := range p.Srcs {
-               if v, ok := GlobalSettings[p.Name]; ok && !v.(bool) {
-                       return nil
-               }
                dat, err := f.Data()
                if err != nil {
                        return err
@@ -95,14 +99,19 @@ func (p *Plugin) Load() error {
                if err != nil {
                        return err
                }
-               p.Loaded = true
-               RegisterGlobalOption(p.Name, true)
        }
+       p.Loaded = true
+       RegisterGlobalOption(p.Name, true)
        return nil
 }
 
+// Call calls a given function in this plugin
 func (p *Plugin) Call(fn string, args ...lua.LValue) (lua.LValue, error) {
        plug := ulua.L.GetGlobal(p.Name)
+       if plug == lua.LNil {
+               log.Println("Plugin does not exist:", p.Name, "at", p.DirName, ":", p)
+               return nil, nil
+       }
        luafn := ulua.L.GetField(plug, fn)
        if luafn == lua.LNil {
                return nil, ErrNoSuchFunction
@@ -120,7 +129,23 @@ func (p *Plugin) Call(fn string, args ...lua.LValue) (lua.LValue, error) {
        return ret, nil
 }
 
+// FindPlugin returns the plugin with the given name
 func FindPlugin(name string) *Plugin {
+       var pl *Plugin
+       for _, p := range Plugins {
+               if !p.IsEnabled() {
+                       continue
+               }
+               if p.Name == name {
+                       pl = p
+                       break
+               }
+       }
+       return pl
+}
+
+// FindAnyPlugin does not require the plugin to be enabled
+func FindAnyPlugin(name string) *Plugin {
        var pl *Plugin
        for _, p := range Plugins {
                if p.Name == name {