From 215ce412a8bf37f31f5e779fe45930b87b1bffec Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Mon, 22 Sep 2025 23:00:18 +0200 Subject: feat(widget): credits --- widget/api/credits.go | 23 +++++++++++++++++++++++ widget/api/handle.go | 15 ++++++++++++++- widget/api/hello.go | 4 +--- widget/widget.go | 20 ++++++++++++++++++++ 4 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 widget/api/credits.go (limited to 'widget') 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...) -- cgit v1.2.3