diff --git a/cmd/dynamo-browse/main.go b/cmd/dynamo-browse/main.go index 8c77891..c7957e6 100644 --- a/cmd/dynamo-browse/main.go +++ b/cmd/dynamo-browse/main.go @@ -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) diff --git a/internal/dynamo-browse/models/attrpath.go b/internal/dynamo-browse/models/attrpath.go new file mode 100644 index 0000000..34c3a2c --- /dev/null +++ b/internal/dynamo-browse/models/attrpath.go @@ -0,0 +1,6 @@ +package models + +type AttrPathNode struct { + Key string + Parent *AttrPathNode +} diff --git a/internal/dynamo-browse/services/itemrenderer/service.go b/internal/dynamo-browse/services/itemrenderer/service.go index d3a4881..d0de447 100644 --- a/internal/dynamo-browse/services/itemrenderer/service.go +++ b/internal/dynamo-browse/services/itemrenderer/service.go @@ -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 + " )" +}