Item annotations and async methods #4
|
|
@ -110,7 +110,7 @@ func main() {
|
|||
|
||||
tableService := tables.NewService(dynamoProvider, settingStore)
|
||||
workspaceService := viewsnapshot.NewService(resultSetSnapshotStore)
|
||||
itemRendererService := itemrenderer.NewService(uiStyles.ItemView.FieldType, uiStyles.ItemView.MetaInfo)
|
||||
itemRendererService := itemrenderer.NewService(nil, uiStyles.ItemView.FieldType, uiStyles.ItemView.MetaInfo)
|
||||
jobsService := jobs.NewService(eventBus)
|
||||
inputHistoryService := inputhistory.New(inputHistoryStore)
|
||||
|
||||
|
|
|
|||
6
internal/dynamo-browse/models/attrpath.go
Normal file
6
internal/dynamo-browse/models/attrpath.go
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
package models
|
||||
|
||||
type AttrPathNode struct {
|
||||
Key string
|
||||
Parent *AttrPathNode
|
||||
}
|
||||
|
|
@ -2,18 +2,25 @@ package itemrenderer
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"lmika.dev/cmd/dynamo-browse/internal/dynamo-browse/models"
|
||||
"lmika.dev/cmd/dynamo-browse/internal/dynamo-browse/models/itemrender"
|
||||
"io"
|
||||
"text/tabwriter"
|
||||
|
||||
"lmika.dev/cmd/dynamo-browse/internal/dynamo-browse/models"
|
||||
"lmika.dev/cmd/dynamo-browse/internal/dynamo-browse/models/itemrender"
|
||||
)
|
||||
|
||||
type Service struct {
|
||||
styles styleRenderer
|
||||
annotations Annotation
|
||||
styles styleRenderer
|
||||
}
|
||||
|
||||
func NewService(fileTypeStyle StyleRenderer, metaInfoStyle StyleRenderer) *Service {
|
||||
func NewService(
|
||||
annotations Annotation,
|
||||
fileTypeStyle StyleRenderer,
|
||||
metaInfoStyle StyleRenderer,
|
||||
) *Service {
|
||||
return &Service{
|
||||
annotations: testAnnotation{},
|
||||
styles: styleRenderer{
|
||||
fileTypeRenderer: fileTypeStyle,
|
||||
metaInfoRenderer: metaInfoStyle,
|
||||
|
|
@ -33,25 +40,47 @@ func (s *Service) RenderItem(w io.Writer, item models.Item, resultSet *models.Re
|
|||
for _, colName := range resultSet.Columns() {
|
||||
seenColumns[colName] = struct{}{}
|
||||
if r := itemrender.ToRenderer(item[colName]); r != nil {
|
||||
s.renderItem(tabWriter, "", colName, r, styles)
|
||||
p := models.AttrPathNode{Key: colName}
|
||||
s.renderItem(tabWriter, resultSet, item, p, "", r, styles)
|
||||
}
|
||||
}
|
||||
for k, _ := range item {
|
||||
if _, seen := seenColumns[k]; !seen {
|
||||
if r := itemrender.ToRenderer(item[k]); r != nil {
|
||||
s.renderItem(tabWriter, "", k, r, styles)
|
||||
p := models.AttrPathNode{Key: k}
|
||||
s.renderItem(tabWriter, resultSet, item, p, "", 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()))
|
||||
func (m *Service) renderItem(
|
||||
w io.Writer,
|
||||
resultSet *models.ResultSet,
|
||||
item models.Item,
|
||||
path models.AttrPathNode,
|
||||
prefix string,
|
||||
r itemrender.Renderer,
|
||||
sr styleRenderer,
|
||||
) {
|
||||
fmt.Fprint(w, prefix)
|
||||
fmt.Fprint(w, path.Key)
|
||||
fmt.Fprint(w, "\t")
|
||||
fmt.Fprint(w, sr.fileTypeRenderer.Render(r.TypeName()))
|
||||
fmt.Fprint(w, "\t")
|
||||
fmt.Fprint(w, r.StringValue())
|
||||
fmt.Fprint(w, sr.metaInfoRenderer.Render(r.MetaInfo()))
|
||||
if m.annotations != nil {
|
||||
fmt.Fprint(w, " ")
|
||||
fmt.Fprint(w, sr.metaInfoRenderer.Render(m.annotations.AnnotateAttribute(resultSet, item, path)))
|
||||
}
|
||||
fmt.Fprint(w, "\n")
|
||||
|
||||
if subitems := r.SubItems(); len(subitems) > 0 {
|
||||
for _, si := range subitems {
|
||||
m.renderItem(w, prefix+" ", si.Key, si.Value, sr)
|
||||
p := models.AttrPathNode{Key: si.Key, Parent: &path}
|
||||
m.renderItem(w, resultSet, item, p, prefix+" ", si.Value, sr)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -60,3 +89,13 @@ type styleRenderer struct {
|
|||
fileTypeRenderer StyleRenderer
|
||||
metaInfoRenderer StyleRenderer
|
||||
}
|
||||
|
||||
type Annotation interface {
|
||||
AnnotateAttribute(rs *models.ResultSet, item models.Item, path models.AttrPathNode) string
|
||||
}
|
||||
|
||||
type testAnnotation struct{}
|
||||
|
||||
func (t testAnnotation) AnnotateAttribute(rs *models.ResultSet, item models.Item, path models.AttrPathNode) string {
|
||||
return "( annotation of " + path.Key + " )"
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue