From a55a42adda9d85095bab63b8ae1dbe41f3010245 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Mon, 5 Oct 2026 15:02:59 -0400 Subject: [PATCH] wip-devtools --- api_request_builder.go | 124 ++++++++++++++++++ api_request_builder_test.go | 93 +++++++++++++ messages_devtools.go | 11 ++ .../darwin/api_request_builder-dark.png | Bin 0 -> 23383 bytes .../darwin/api_request_builder-light.png | Bin 0 -> 22442 bytes 5 files changed, 228 insertions(+) create mode 100644 api_request_builder.go create mode 100644 api_request_builder_test.go create mode 100644 testdata/snapshots/darwin/api_request_builder-dark.png create mode 100644 testdata/snapshots/darwin/api_request_builder-light.png diff --git a/api_request_builder.go b/api_request_builder.go new file mode 100644 index 0000000..8abceab --- /dev/null +++ b/api_request_builder.go @@ -0,0 +1,124 @@ +package mujica + +import ( + "fmt" + "log/slog" + "net/url" + "slices" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/theme" +) + +// ApiRequest is an HTTP request being built; the caller sends it. +type ApiRequest struct { + // Method is GET when empty. + Method string + URL string + Params []KeyValue + Headers []KeyValue + Body string +} + +// ApiRequestBuilderOptions configure an ApiRequestBuilder. +type ApiRequestBuilderOptions struct { + // Sending shows the request in flight and blocks another send. + Sending bool + Disabled bool +} + +// ApiRequestResult reports this frame's events. +type ApiRequestResult struct { + Element *ui.Element + // Send asks the caller to send the request. + Send bool + Changed bool +} + +type apiRequestState struct{ tab int } + +var apiMethods = []string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"} + +// ApiRequestBuilder edits method, URL, query parameters, headers and body, and reports a send. +func ApiRequestBuilder(c *ui.Context, req *ApiRequest, opts ApiRequestBuilderOptions) ApiRequestResult { + if req == nil { + panic("mujica: ApiRequestBuilder needs a request") + } + if req.Method == "" { + req.Method = "GET" + } + if !slices.Contains(apiMethods, req.Method) { + panic("mujica: ApiRequestBuilder method " + req.Method + " is not offered") + } + u := Density(c).Unit() + var r ApiRequestResult + r.Element = ui.Column(c).Shrink(0).Gap(u * 3).Disabled(opts.Disabled) + st := ui.Local(r.Element, "mujica.apirequest", func() apiRequestState { return apiRequestState{} }) + locked := r.Element.IsDisabled() + full, urlErr := apiRequestURL(*req) + r.Element.Children(func() { + ui.Row(c).Gap(u * 2).AlignItems(ui.Start).Children(func() { + methods := make([]SelectOption[string], len(apiMethods)) + for i, m := range apiMethods { + methods[i] = SelectOption[string]{Value: m, Label: m} + } + r.Changed = Select(c, &req.Method, methods, SelectOptions{Label: msg(c, "api_request_builder.method"), Disabled: locked}).Changed() + shownErr := "" + if req.URL != "" && urlErr != nil { + shownErr = urlErr.Error() + } + in := TextInput(c, &req.URL, TextInputOptions{Placeholder: "https://", Label: msg(c, "api_request_builder.url"), Disabled: locked, Error: shownErr}) + in.Element.Grow(1) + r.Changed = r.Changed || in.Changed() + ready := urlErr == nil && !opts.Sending && !locked + send := Button(c, msg(c, "api_request_builder.send"), ButtonOptions{Icon: icons.Must("upload"), Loading: opts.Sending, Disabled: locked || urlErr != nil}) + r.Send = ready && (send.Clicked() || in.Submitted()) + }) + if urlErr == nil { + codeMono(c, req.Method+" "+full).TextColor(Tokens(c).TextMuted) + } + tabs := []Tab{ + {Label: fmt.Sprintf(msg(c, "api_request_builder.params"), len(keyValueEnabled(req.Params))), Panel: func() { + r.Changed = KeyValueInput(c, &req.Params, KeyValueInputOptions{Label: msg(c, "api_request_builder.params_label"), Disabled: locked}).Changed() || r.Changed + }}, + {Label: fmt.Sprintf(msg(c, "api_request_builder.headers"), len(keyValueEnabled(req.Headers))), Panel: func() { + r.Changed = KeyValueInput(c, &req.Headers, KeyValueInputOptions{Label: msg(c, "api_request_builder.headers_label"), Disabled: locked}).Changed() || r.Changed + }}, + {Label: msg(c, "api_request_builder.body"), Panel: func() { + if req.Method == "GET" || req.Method == "HEAD" { + agentCaption(c, msg(c, "api_request_builder.no_body")) + } + body := TextArea(c, &req.Body, TextAreaOptions{Label: msg(c, "api_request_builder.body"), MinHeight: 120, MaxHeight: 320, Disabled: locked}) + body.Input.Font(theme.MonoFont) + r.Changed = r.Changed || body.Changed() + }}, + } + Tabs(c, &st.tab, tabs, TabsOptions{Label: msg(c, "api_request_builder.parts")}) + }) + if r.Send { + slog.Debug("mujica: api_request_builder send", "method", req.Method) // never the URL: it may hold a token + } + return r +} + +// apiRequestURL joins the URL with its enabled query parameters, or says why it is invalid. +func apiRequestURL(req ApiRequest) (string, error) { + if req.URL == "" { + return "", fmt.Errorf("empty URL") + } + u, err := url.Parse(req.URL) + if err != nil { + return "", err + } + if (u.Scheme != "http" && u.Scheme != "https") || u.Host == "" { + return "", fmt.Errorf("the URL needs http:// or https:// and a host") + } + q := u.Query() + for _, kv := range keyValueEnabled(req.Params) { + q.Add(kv.Key, kv.Value) + } + u.RawQuery = q.Encode() + return u.String(), nil +} diff --git a/api_request_builder_test.go b/api_request_builder_test.go new file mode 100644 index 0000000..151a7c5 --- /dev/null +++ b/api_request_builder_test.go @@ -0,0 +1,93 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +func apiTester(req *ApiRequest, opts *ApiRequestBuilderOptions, sends *int) *ui.Tester { + return ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Padding(8).Children(func() { + if ApiRequestBuilder(c, req, *opts).Send { + *sends++ + } + }) + }, 760, 520) +} + +func TestApiRequestBuilderBuildAndSend(t *testing.T) { + var req ApiRequest + opts := ApiRequestBuilderOptions{} + sends := 0 + tt := apiTester(&req, &opts, &sends) + if req.Method != "GET" { + t.Fatalf("default method %q", req.Method) + } + _ = tt.Click("Send") // disabled without a URL + _ = tt.Click("Request URL") + tt.Type("ftp://court") + if !tt.HasText("the URL needs http:// or https:// and a host") || sends != 0 { + t.Fatalf("invalid URL: %q", tt.Texts()) + } + req.URL = "" + tt.Frame() + _ = tt.Click("Request URL") + tt.Type("https://court.example/guests") + _ = tt.Click("Add row") + _ = tt.Click("Row 1 Key") + tt.Type("page") + tt.Key(0, ui.KeyTab) + tt.Type("2") + if !tt.HasText("GET https://court.example/guests?page=2") || !tt.HasText("Params (1)") { + t.Fatalf("preview: %q", tt.Texts()) + } + _ = tt.Click("Request URL") + tt.Key(0, ui.KeyEnter) + _ = tt.Click("Send") + if sends != 2 { + t.Fatalf("sends %d", sends) + } + _ = tt.Click("Method") + _ = tt.Click("POST") + _ = tt.Click("Body") + if req.Method != "POST" || tt.HasText("GET and HEAD requests usually carry no body.") { + t.Fatalf("method %q", req.Method) + } +} + +func TestApiRequestBuilderSendingAndDisabled(t *testing.T) { + req := ApiRequest{URL: "https://court.example"} + opts := ApiRequestBuilderOptions{Sending: true} + sends := 0 + tt := apiTester(&req, &opts, &sends) + _ = tt.Click("Request URL") + tt.Key(0, ui.KeyEnter) + if sends != 0 { + t.Fatal("sent while sending") + } + opts = ApiRequestBuilderOptions{Disabled: true} + tt.Frame() + _ = tt.Click("Send") + _ = tt.Click("Request URL") + tt.Type("x") + if sends != 0 || req.URL != "https://court.example" { + t.Fatalf("disabled: %q sends %d", req.URL, sends) + } + defer func() { + if recover() == nil { + t.Fatal("unknown method did not panic") + } + }() + apiTester(&ApiRequest{Method: "BREW"}, &ApiRequestBuilderOptions{}, &sends) +} + +func TestApiRequestBuilderSnapshot(t *testing.T) { + snapshot(t, "api_request_builder", 720, 330, func(c *ui.Context) { + req := ApiRequest{Method: "POST", URL: "https://court.example/guests", + Params: []KeyValue{{Key: "notify", Value: "true", Enabled: true}}, + Headers: []KeyValue{{Key: "Accept", Value: "application/json", Enabled: true}}} + ui.Column(c).Padding(16).Children(func() { ApiRequestBuilder(c, &req, ApiRequestBuilderOptions{}) }) + }) +} diff --git a/messages_devtools.go b/messages_devtools.go index 57d55fd..1b8a9e1 100644 --- a/messages_devtools.go +++ b/messages_devtools.go @@ -95,6 +95,17 @@ func init() { "schema_tree.column": {"Column", "列"}, "schema_tree.index": {"Index", "索引"}, + "api_request_builder.method": {"Method", "方法"}, + "api_request_builder.url": {"Request URL", "请求地址"}, + "api_request_builder.send": {"Send", "发送"}, + "api_request_builder.params": {"Params (%d)", "参数(%d)"}, + "api_request_builder.params_label": {"Query parameters", "查询参数"}, + "api_request_builder.headers": {"Headers (%d)", "请求头(%d)"}, + "api_request_builder.headers_label": {"Request headers", "请求头"}, + "api_request_builder.body": {"Body", "正文"}, + "api_request_builder.no_body": {"GET and HEAD requests usually carry no body.", "GET 与 HEAD 请求通常不带正文。"}, + "api_request_builder.parts": {"Request parts", "请求组成"}, + "alert_list.empty": {"No alerts", "没有告警"}, }) } diff --git a/testdata/snapshots/darwin/api_request_builder-dark.png b/testdata/snapshots/darwin/api_request_builder-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..96395613c90b97e8ffe3cd1d0d4d18676113bd48 GIT binary patch literal 23383 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 TjjO=F)|*-ydZ1FZhcEsKD9Ez| literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/api_request_builder-light.png b/testdata/snapshots/darwin/api_request_builder-light.png new file mode 100644 index 0000000000000000000000000000000000000000..89bc6c36e515c2672718ba179ff43ce0c7dfcebe GIT binary patch literal 22442 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 z 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