summaryrefslogtreecommitdiff
path: root/plugin.go
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2022-11-06 19:57:20 -0600
committerJeff Carr <[email protected]>2022-11-06 19:57:20 -0600
commitb410d0fd083ee89eed410cda2123a22cddcd3f44 (patch)
tree3f1a637003629a3ec7d383b5db6beb0df9e5a97c /plugin.go
parente55fb6675d692e3f44fa67b02b12661e476bd028 (diff)
Implement a early AddButton() via a golang pluginv0.4.5
pass a name to gocui.AddButton() cleaner plugin usage add the start to golang plugin plugin stuff in a single file added a button correctly andlabs/ui added a button via plugin to gocli hot diggity! trying to invoke a gocli plugin function from the andlabs ui load the plugin hide more debugging output turn off all output Signed-off-by: Jeff Carr <[email protected]>
Diffstat (limited to 'plugin.go')
-rw-r--r--plugin.go90
1 files changed, 90 insertions, 0 deletions
diff --git a/plugin.go b/plugin.go
new file mode 100644
index 0000000..5c10e03
--- /dev/null
+++ b/plugin.go
@@ -0,0 +1,90 @@
+package gui
+
+import (
+ "log"
+ "os"
+
+ "plugin"
+ "github.com/davecgh/go-spew/spew"
+)
+
+type Greeter interface {
+ Greet()
+ JcarrButton()
+ AddButton(string)
+}
+
+var PlugGocli *plugin.Plugin
+var PlugHello *plugin.Plugin
+
+// var gBut plugin.Symbol
+var jcarrBut plugin.Symbol
+var symGreeter plugin.Symbol
+var greeter Greeter
+var ok bool
+
+func LoadPlugin(name string) *plugin.Plugin {
+ scs := spew.ConfigState{MaxDepth: 1}
+
+ // load module
+ // 1. open the so file to load the symbols
+ plug, err := plugin.Open(name)
+ log.Println("plug =")
+ log.Println(scs.Sdump(plug))
+ if err != nil {
+ log.Println(err)
+ os.Exit(1)
+ }
+ PlugGocli = plug
+
+ // 2. look up a symbol (an exported function or variable)
+ // in this case, variable Greeter
+ symGreeter, err = plug.Lookup("Greeter")
+ log.Println("symGreater", symGreeter)
+ log.Println(scs.Sdump(symGreeter))
+ if err != nil {
+ log.Println(err)
+ os.Exit(1)
+ }
+
+ // 3. Assert that loaded symbol is of a desired type
+ // in this case interface type Greeter (defined above)
+ // var greeter Greeter
+ greeter, ok = symGreeter.(Greeter)
+ log.Println("greeter", symGreeter)
+ log.Println(scs.Sdump(greeter))
+ if !ok {
+ log.Println("unexpected type from module symbol")
+ os.Exit(1)
+ }
+ return plug
+}
+
+func RunGreet() {
+ log.Println("gui.RunGreet() START")
+ if (greeter == nil) {
+ log.Println("wit/gui gocui plugin didn't load")
+ return
+ }
+ greeter.Greet()
+}
+
+func LookupJcarrButton() {
+ log.Println("lookupJcarrButton() START")
+
+ if (greeter == nil) {
+ log.Println("wit/gui gocui plugin didn't load")
+ return
+ }
+ greeter.JcarrButton()
+}
+
+func GocuiAddButton(name string) {
+ log.Println("GocuiAddButton() START", name)
+
+ if (greeter == nil) {
+ log.Println("wit/gui gocui plugin didn't load")
+ return
+ }
+ greeter.AddButton(name)
+}