diff --git a/tui/rest/init.go b/tui/rest/init.go index d8b6df0..f064f50 100644 --- a/tui/rest/init.go +++ b/tui/rest/init.go @@ -1,15 +1,94 @@ package rest -import "github.com/rivo/tview" +import ( + "github.com/gdamore/tcell/v2" + "github.com/rivo/tview" +) -type Rest struct{} - -func New() Rest { - return Rest{} +type Rest struct { + app *tview.Application + panels []tview.Primitive + index int } -func (r Rest) Root() *tview.Box { - return tview.NewBox(). +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("Hello Rest") + 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) } diff --git a/tui/tui.go b/tui/tui.go index 64e89ff..b2f24e6 100644 --- a/tui/tui.go +++ b/tui/tui.go @@ -2,12 +2,12 @@ package tui import ( "git.embergate.com/saeedafzal/restui/tui/rest" - "github.com/rivo/tview" "github.com/gdamore/tcell/v2" + "github.com/rivo/tview" ) type Tui struct { - app *tview.Application + app *tview.Application pages *tview.Pages } @@ -16,18 +16,17 @@ func New(app *tview.Application) Tui { } func (t Tui) Root() *tview.Pages { - rest := rest.New() + rest := rest.New(t.app) t.pages.AddPage("rest", rest.Root(), true, true) - t.pages.SetInputCapture(t.rootInputCapture) + + t.pages.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { + if event.Rune() == 'q' { + t.app.Stop() + return nil + } + return event + }) return t.pages } - -func (t Tui) rootInputCapture(event *tcell.EventKey) *tcell.EventKey { - if event.Rune() == 'q' { - t.app.Stop() - return nil - } - return event -}