package rest import ( "github.com/gdamore/tcell/v2" "github.com/rivo/tview" ) type Rest struct { app *tview.Application panels []tview.Primitive index int } func New(app *tview.Application) *Rest { return &Rest{ app, make([]tview.Primitive, 5), 0, } } func (r *Rest) Root() *tview.Flex { flex := tview.NewFlex(). AddItem(r.request(), 0, 1, true). AddItem(r.response(), 0, 1, false) flex.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { if event.Key() == tcell.KeyCtrlJ { r.index = (r.index + 1) % len(r.panels) r.app.SetFocus(r.panels[r.index]) return nil } else if event.Key() == tcell.KeyCtrlK { length := len(r.panels) r.index = (r.index - 1 + length) % length r.app.SetFocus(r.panels[r.index]) return nil } return event }) return flex } func (r *Rest) request() *tview.Flex { form := tview.NewForm(). AddDropDown("Method", []string{"GET", "POST", "PUT", "DELETE"}, 0, nil). AddInputField("URL", "", 0, nil, nil). AddButton("Headers", nil). AddButton("Send", nil) form. SetBorder(true). SetTitle("Request Form") body := tview.NewTextArea(). SetPlaceholder("Enter request body (ctrl + e to open editor)") body. SetBorder(true). SetTitle("Request Body") summary := tview.NewTextView() summary. SetBorder(true). SetTitle("Request Summary") r.panels[0] = form r.panels[1] = body r.panels[2] = summary return tview.NewFlex(). SetDirection(tview.FlexRow). AddItem(form, 9, 0, true). AddItem(body, 0, 1, false). AddItem(summary, 0, 1, false) } func (r *Rest) response() *tview.Flex { summary := tview.NewTextView() summary. SetBorder(true). SetTitle("Response Summary") body := tview.NewTextView() body. SetBorder(true). SetTitle("Response Body") r.panels[3] = summary r.panels[4] = body return tview.NewFlex(). SetDirection(tview.FlexRow). AddItem(summary, 0, 1, false). AddItem(body, 0, 1, false) }