Item annotations and async methods #4
|
|
@ -110,7 +110,7 @@ func main() {
|
||||||
|
|
||||||
tableService := tables.NewService(dynamoProvider, settingStore)
|
tableService := tables.NewService(dynamoProvider, settingStore)
|
||||||
workspaceService := viewsnapshot.NewService(resultSetSnapshotStore)
|
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)
|
jobsService := jobs.NewService(eventBus)
|
||||||
inputHistoryService := inputhistory.New(inputHistoryStore)
|
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 (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"lmika.dev/cmd/dynamo-browse/internal/dynamo-browse/models"
|
|
||||||
"lmika.dev/cmd/dynamo-browse/internal/dynamo-browse/models/itemrender"
|
|
||||||
"io"
|
"io"
|
||||||
"text/tabwriter"
|
"text/tabwriter"
|
||||||
|
|
||||||
|
"lmika.dev/cmd/dynamo-browse/internal/dynamo-browse/models"
|
||||||
|
"lmika.dev/cmd/dynamo-browse/internal/dynamo-browse/models/itemrender"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Service struct {
|
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{
|
return &Service{
|
||||||
|
annotations: testAnnotation{},
|
||||||
styles: styleRenderer{
|
styles: styleRenderer{
|
||||||
fileTypeRenderer: fileTypeStyle,
|
fileTypeRenderer: fileTypeStyle,
|
||||||
metaInfoRenderer: metaInfoStyle,
|
metaInfoRenderer: metaInfoStyle,
|
||||||
|
|
@ -33,25 +40,47 @@ func (s *Service) RenderItem(w io.Writer, item models.Item, resultSet *models.Re
|
||||||
for _, colName := range resultSet.Columns() {
|
for _, colName := range resultSet.Columns() {
|
||||||
seenColumns[colName] = struct{}{}
|
seenColumns[colName] = struct{}{}
|
||||||
if r := itemrender.ToRenderer(item[colName]); r != nil {
|
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 {
|
for k, _ := range item {
|
||||||
if _, seen := seenColumns[k]; !seen {
|
if _, seen := seenColumns[k]; !seen {
|
||||||
if r := itemrender.ToRenderer(item[k]); r != nil {
|
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()
|
tabWriter.Flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Service) renderItem(w io.Writer, prefix string, name string, r itemrender.Renderer, sr styleRenderer) {
|
func (m *Service) renderItem(
|
||||||
fmt.Fprintf(w, "%s%v\t%s\t%s%s\n",
|
w io.Writer,
|
||||||
prefix, name, sr.fileTypeRenderer.Render(r.TypeName()), r.StringValue(), sr.metaInfoRenderer.Render(r.MetaInfo()))
|
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 {
|
if subitems := r.SubItems(); len(subitems) > 0 {
|
||||||
for _, si := range subitems {
|
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
|
fileTypeRenderer StyleRenderer
|
||||||
metaInfoRenderer 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