issue-10: copy item to clipboard

Added key binding to copy selected, or marked, items to clipboard.
This commit is contained in:
Leon Mika 2022-08-20 10:41:32 +10:00
parent f0bd3022cc
commit 90ec88d360
11 changed files with 236 additions and 86 deletions

View file

@ -0,0 +1,62 @@
package itemrenderer
import (
"fmt"
"github.com/lmika/audax/internal/dynamo-browse/models"
"github.com/lmika/audax/internal/dynamo-browse/models/itemrender"
"io"
"text/tabwriter"
)
type Service struct {
styles styleRenderer
}
func NewService(fileTypeStyle StyleRenderer, metaInfoStyle StyleRenderer) *Service {
return &Service{
styles: styleRenderer{
fileTypeRenderer: fileTypeStyle,
metaInfoRenderer: metaInfoStyle,
},
}
}
func (s *Service) RenderItem(w io.Writer, item models.Item, resultSet *models.ResultSet, plainText bool) {
styles := s.styles
if plainText {
styles = styleRenderer{plainTextStyleRenderer{}, plainTextStyleRenderer{}}
}
tabWriter := tabwriter.NewWriter(w, 0, 1, 1, ' ', 0)
seenColumns := make(map[string]struct{})
for _, colName := range resultSet.Columns() {
seenColumns[colName] = struct{}{}
if r := item.Renderer(colName); r != nil {
s.renderItem(tabWriter, "", colName, r, styles)
}
}
for k, _ := range item {
if _, seen := seenColumns[k]; !seen {
if r := item.Renderer(k); r != nil {
s.renderItem(tabWriter, "", k, r, styles)
}
}
}
tabWriter.Flush()
}
func (m *Service) renderItem(w io.Writer, prefix string, name string, r itemrender.Renderer, sr styleRenderer) {
fmt.Fprintf(w, "%s%v\t%s\t%s%s\n",
prefix, name, sr.fileTypeRenderer.Render(r.TypeName()), r.StringValue(), sr.metaInfoRenderer.Render(r.MetaInfo()))
if subitems := r.SubItems(); len(subitems) > 0 {
for _, si := range subitems {
m.renderItem(w, prefix+" ", si.Key, si.Value, sr)
}
}
}
type styleRenderer struct {
fileTypeRenderer StyleRenderer
metaInfoRenderer StyleRenderer
}

View file

@ -0,0 +1,11 @@
package itemrenderer
type StyleRenderer interface {
Render(str string) string
}
type plainTextStyleRenderer struct{}
func (plainTextStyleRenderer) Render(str string) string {
return str
}