Added annotation type

This commit is contained in:
Leon Mika 2025-11-01 09:50:55 +11:00
parent c8b65f6b0a
commit a733a47d5c
3 changed files with 56 additions and 11 deletions

View file

@ -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)

View file

@ -0,0 +1,6 @@
package models
type AttrPathNode struct {
Key string
Parent *AttrPathNode
}

View file

@ -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 + " )"
}