aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--widget/api/credits.go23
-rw-r--r--widget/api/handle.go15
-rw-r--r--widget/api/hello.go4
-rw-r--r--widget/widget.go20
4 files changed, 58 insertions, 4 deletions
diff --git a/widget/api/credits.go b/widget/api/credits.go
new file mode 100644
index 0000000..e30cbea
--- /dev/null
+++ b/widget/api/credits.go
@@ -0,0 +1,23 @@
+package api
+
+import (
+ "encoding/json"
+ "io"
+)
+
+const MethodCredits Method = "credits"
+
+type Credits struct {
+ Author string `json:"author"`
+ Homepage string `json:"homepage"`
+ Other []string `json:"other,omitempty"`
+}
+
+func (c *Credits) Respond(w io.Writer, _ ...string) error {
+ b, err := json.Marshal(c)
+ if err != nil {
+ return err
+ }
+ _, err = w.Write(b)
+ return err
+}
diff --git a/widget/api/handle.go b/widget/api/handle.go
index e04d3d2..fed2142 100644
--- a/widget/api/handle.go
+++ b/widget/api/handle.go
@@ -8,16 +8,27 @@ import (
type Widget struct {
Hello
+ Credits
Writer io.Writer
}
-func NewWidget(name, id string) *Widget {
+type MethodResponder interface {
+ Respond(io.Writer, ...string) error
+}
+
+type Method string
+
+func NewWidget(name, id string, author, homepage string) *Widget {
return &Widget{
Hello: Hello{
Name: name,
ID: id,
Version: 1,
},
+ Credits: Credits{
+ Author: author,
+ Homepage: homepage,
+ },
Writer: os.Stdout,
}
}
@@ -29,6 +40,8 @@ func (w *Widget) Handle() error {
switch Method(os.Args[1]) {
case MethodHello:
return w.Hello.Respond(w.Writer)
+ case MethodCredits:
+ return w.Credits.Respond(w.Writer)
}
return fmt.Errorf("unknown method: %s", os.Args[1])
}
diff --git a/widget/api/hello.go b/widget/api/hello.go
index 7995a36..fd071d5 100644
--- a/widget/api/hello.go
+++ b/widget/api/hello.go
@@ -5,8 +5,6 @@ import (
"io"
)
-type Method string
-
const MethodHello Method = "hello"
type Hello struct {
@@ -15,7 +13,7 @@ type Hello struct {
Version uint `json:"version"`
}
-func (h *Hello) Respond(w io.Writer) error {
+func (h *Hello) Respond(w io.Writer, _ ...string) error {
b, err := json.Marshal(h)
if err != nil {
return err
diff --git a/widget/widget.go b/widget/widget.go
index 29a8f3a..140cbf1 100644
--- a/widget/widget.go
+++ b/widget/widget.go
@@ -92,6 +92,26 @@ func readPluginDir(dir []os.DirEntry, path string) ([]*Widget, error) {
return widgets, nil
}
+func (w *Widget) FetchCredits(ctx context.Context) (*api.Credits, error) {
+ c := make(chan any)
+ go w.Request(ctx, api.MethodCredits, c)
+ select {
+ case <-ctx.Done():
+ return nil, ctx.Err()
+ case out := <-c:
+ err, ok := out.(error)
+ if ok {
+ return nil, err
+ }
+ b, ok := out.([]byte)
+ if !ok {
+ return nil, errors.Join(ErrUnexceptedType, fmt.Errorf("got %T instead of []byte", out))
+ }
+ var credits api.Credits
+ return &credits, json.Unmarshal(b, &credits)
+ }
+}
+
func (w *Widget) Request(_ context.Context, m api.Method, c chan<- any, args ...string) {
args = append([]string{string(m)}, args...)
cmd := exec.Command(fmt.Sprintf("./plugins/%s", w.Path), args...)