dynamo-browse/internal/dynamo-browse/ui/teamodels/dynamoitemview/model.go

103 lines
2.4 KiB
Go
Raw Normal View History

2022-03-27 21:43:53 +00:00
package dynamoitemview
import (
"fmt"
"strings"
"text/tabwriter"
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
"github.com/charmbracelet/bubbles/viewport"
tea "github.com/charmbracelet/bubbletea"
2022-03-27 21:58:41 +00:00
"github.com/charmbracelet/lipgloss"
2022-03-27 21:43:53 +00:00
"github.com/lmika/awstools/internal/dynamo-browse/models"
2022-03-27 21:58:41 +00:00
"github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/frame"
2022-03-27 21:43:53 +00:00
"github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/layout"
)
2022-03-30 11:52:26 +00:00
var (
activeHeaderStyle = lipgloss.NewStyle().
Bold(true).
Foreground(lipgloss.Color("#ffffff")).
Background(lipgloss.Color("#4479ff"))
)
2022-03-27 21:43:53 +00:00
type Model struct {
2022-03-27 21:58:41 +00:00
ready bool
frameTitle frame.FrameTitle
viewport viewport.Model
w, h int
2022-03-27 21:43:53 +00:00
// model state
currentResultSet *models.ResultSet
selectedItem models.Item
}
func New() *Model {
return &Model{
2022-03-30 11:52:26 +00:00
frameTitle: frame.NewFrameTitle("Item", false, activeHeaderStyle),
2022-03-27 21:58:41 +00:00
viewport: viewport.New(100, 100),
2022-03-27 21:43:53 +00:00
}
}
func (*Model) Init() tea.Cmd {
2022-03-27 21:43:53 +00:00
return nil
}
func (m *Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
2022-03-27 21:43:53 +00:00
switch msg := msg.(type) {
case NewItemSelected:
m.currentResultSet = msg.ResultSet
m.selectedItem = msg.Item
m.updateViewportToSelectedMessage()
return m, nil
}
return m, nil
}
func (m *Model) View() string {
2022-03-27 21:43:53 +00:00
if !m.ready {
return ""
}
2022-03-27 21:58:41 +00:00
return lipgloss.JoinVertical(lipgloss.Top, m.frameTitle.View(), m.viewport.View())
2022-03-27 21:43:53 +00:00
}
func (m *Model) Resize(w, h int) layout.ResizingModel {
2022-03-27 21:43:53 +00:00
m.w, m.h = w, h
if !m.ready {
2022-03-28 10:07:11 +00:00
m.viewport = viewport.New(w, h-m.frameTitle.HeaderHeight())
m.viewport.SetContent("")
2022-03-27 21:43:53 +00:00
m.ready = true
} else {
m.viewport.Width = w
2022-03-27 21:58:41 +00:00
m.viewport.Height = h - m.frameTitle.HeaderHeight()
2022-03-27 21:43:53 +00:00
}
2022-03-27 21:58:41 +00:00
m.frameTitle.Resize(w, h)
2022-03-27 21:43:53 +00:00
return m
}
func (m *Model) updateViewportToSelectedMessage() {
if m.selectedItem == nil {
m.viewport.SetContent("")
}
viewportContent := &strings.Builder{}
tabWriter := tabwriter.NewWriter(viewportContent, 0, 1, 1, ' ', 0)
for _, colName := range m.currentResultSet.Columns {
switch colVal := m.selectedItem[colName].(type) {
case nil:
break
case *types.AttributeValueMemberS:
fmt.Fprintf(tabWriter, "%v\tS\t%s\n", colName, colVal.Value)
case *types.AttributeValueMemberN:
fmt.Fprintf(tabWriter, "%v\tN\t%s\n", colName, colVal.Value)
default:
fmt.Fprintf(tabWriter, "%v\t?\t%s\n", colName, "(other)")
}
}
tabWriter.Flush()
m.viewport.Width = m.w
2022-03-27 21:58:41 +00:00
m.viewport.Height = m.h - m.frameTitle.HeaderHeight()
2022-03-27 21:43:53 +00:00
m.viewport.SetContent(viewportContent.String())
}