diff --git a/humanTable.go b/humanTable.go index 050e7ec..09c9ff2 100644 --- a/humanTable.go +++ b/humanTable.go @@ -13,6 +13,37 @@ import ( // sizes := []int{40, 12, 6, 12, 16, 16, 16, 12, 12, 8} // log.Info(standardTableSize10(sizes, args)) +// returns the line and the Sprintf fmt string +func StandardTableRow(sizes []int, args []string) (string, string) { + var fmtline string + var line string + for i, si := range sizes { + var cell string + var sfmt string + if si == 0 { + sfmt = "%-s " + } else { + sfmt = "%-" + fmt.Sprintf("%d", si) + "." + fmt.Sprintf("%d", si) + "s " + } + fmtline += sfmt + if len(args) > i { + val := args[i] + cell = fmt.Sprintf(sfmt, val) + line += cell + } else { + break + } + } + + var small int + if len(line) > WIDTH { + small = WIDTH + } else { + small = len(line) - 3 + } + return line[0:small], fmtline +} + func StandardTableSize5(sizes []int, args []string) string { WIDTH, _ := getTerminalWidth() var s string diff --git a/tablePB.go b/tablePB.go index be757d5..2705a45 100644 --- a/tablePB.go +++ b/tablePB.go @@ -4,14 +4,13 @@ package cobol import ( "fmt" + "os" "time" "go.wit.com/lib/gui/shell" "go.wit.com/lib/protobuf/guipb" "go.wit.com/log" - "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/anypb" - "google.golang.org/protobuf/types/known/timestamppb" "google.golang.org/protobuf/types/known/wrapperspb" ) @@ -24,112 +23,40 @@ func PrintTable(pb *guipb.Table) { log.Info("grid.Id =", pb.Grid.Id) } + if pb.Height < 4 { + pb.Height = 4 + } var h int = 0 var w int = 0 + var args []string + var sizes []int for _, name := range pb.Order { - if addTableRow(pb, name, w) { - log.Info("tree:row() COLUMN GOOD", pb.Title, name, w, h) - h += 1 - } else { - log.Info("tree:row() COLOMN FAIL", pb.Title, name, w, h) - } - - w += 1 + arg, attr := getColAttr(pb, name) + args = append(args, arg) + sizes = append(sizes, int(attr.Width)) } -} + sizes = []int{24, 5, 8, 32, 13, 4, 4, 4, 4} + header, _ := StandardTableRow(sizes, args) + log.Info(header) -func addTableRow(t *guipb.Table, name string, w int) bool { - var h int = 0 - for _, r := range t.StringRows { - if name != r.Header.Name { - // log.Info("skip string row:", r.Header.Name, "!=", name) - continue - } - log.Info("tree: Add()ing to grid here", r.Header.Id, r.Header.Name, w, h) - for i, v := range r.Vals { - log.Info("String Row", i, w, v) - } - makeGridLabel(r.Header, w, h) - h += 1 - for _, v := range r.Widgets { - log.Info("tree: Add()ing to grid here", v.Id, v.Name, w, h) - makeGridLabel(v, w, h) - h += 1 - } - return true - } - - for _, r := range t.ButtonRows { - if name != r.Header.Name { - // log.Info("skip string row:", r.Header.Name, "!=", name) - continue - } - log.Info("tree: Add()ing to grid here", r.Header.Id, r.Header.Name, w, h) - for i, v := range r.Vals { - log.Info("Button Row", i, v) - } - makeGridLabel(r.Header, w, h) - h += 1 - for _, v := range r.Widgets { - log.Info("tree: Add()ing to grid here", v.Id, v.Name, w, h) - makeGridLabel(v, w, h) - h += 1 - } - return true - } - - for _, r := range t.IntRows { - if name != r.Header.Name { - // log.Info("skip sint row:", r.Header.Name, "!=", name) - continue - } - log.Info("tree: Add()ing to grid here", r.Header.Id, r.Header.Name, w, h) - makeGridLabel(r.Header, w, h) - h += 1 - for _, v := range r.Widgets { - vi, err := extractInt64(v.Val) - if err != nil { - log.Warn("int error", err) + for i := range pb.Height { + var cells []string + for _, name := range pb.Order { + if val, ok := getTableCell(pb, name, int(i)); ok { + // log.Info("tree: CELL GOOD", pb.Title, name, w, h, val) + h += 1 + cells = append(cells, val) + } else { + log.Info("tree: CELL FAIL", pb.Title, name, w, h, val) + cells = append(cells, "err") } - v.Name = fmt.Sprintf("%d", vi) - // log.Info("tree: Add()ing to grid here", v.Id, v.Name, w, h) - makeGridLabel(v, w, h) - h += 1 } - return true + line, fmtline := StandardTableRow(sizes, cells) + if os.Getenv("TABLEPB_VERBOSE") == "true" { + line += "FMT: " + fmtline + } + log.Info(line) } - - for _, r := range t.TimeRows { - if name != r.Header.Name { - // log.Info("skip sint row:", r.Header.Name, "!=", name) - continue - } - // log.Info("tree: Add()ing to grid here", r.Header.Id, r.Header.Name, w, h) - makeGridLabel(r.Header, w, h) - h += 1 - for _, widg := range r.Widgets { - msg, err := anypb.UnmarshalNew(widg.Val, proto.UnmarshalOptions{}) - if err != nil { - log.Fatalf("failed to unmarshal: %v", err) - } - - switch v := msg.(type) { - case *timestamppb.Timestamp: - // fmt.Println("Unpacked Timestamp:", shell.FormatDuration(time.Since(v.AsTime()))) - widg.Name = shell.FormatDuration(time.Since(v.AsTime())) - default: - fmt.Println("Unknown type:", v) - widg.Name = fmt.Sprintf("%v", v) - } - - // log.Info("tree: Add()ing to grid here", widg.Id, widg.Name, w, h) - makeGridLabel(widg, w, h) - h += 1 - } - return true - } - - return false } func makeGridLabel(pb *guipb.Widget, w int, h int) { @@ -143,3 +70,72 @@ func extractInt64(anyVal *anypb.Any) (int64, error) { } return val.Value, nil } + +func getTableCell(t *guipb.Table, name string, row int) (string, bool) { + // find the Column that matches the "name" + for _, r := range t.StringCols { + if name != r.Header.Name { + // log.Info("skip string row:", r.Header.Name, "!=", name) + continue + } + // log.Info("Cell value:", r.Vals[row]) + return r.Vals[row], true + } + for _, r := range t.ButtonCols { + if name != r.Header.Name { + // log.Info("skip string row:", r.Header.Name, "!=", name) + continue + } + // log.Info("Cell value:", r.Vals[row]) + return r.Vals[row], true + } + for _, r := range t.IntCols { + if name != r.Header.Name { + // log.Info("skip string row:", r.Header.Name, "!=", name) + continue + } + return fmt.Sprintf("%d", r.Vals[row]), true + } + for _, r := range t.TimeCols { + if name != r.Header.Name { + // log.Info("skip sint row:", r.Header.Name, "!=", name) + continue + } + cellTime := r.Vals[row] + s := shell.FormatDuration(time.Since(cellTime.AsTime())) + return s, true + } + return "", false +} + +func getColAttr(t *guipb.Table, name string) (string, *guipb.ColAttr) { + // find the Column that matches the "name" + for _, r := range t.StringCols { + if name != r.Header.Name { + continue + } + return r.Header.Name, r.Attr + } + for _, r := range t.ButtonCols { + if name != r.Header.Name { + // log.Info("skip string row:", r.Header.Name, "!=", name) + continue + } + return r.Header.Name, r.Attr + } + for _, r := range t.IntCols { + if name != r.Header.Name { + // log.Info("skip string row:", r.Header.Name, "!=", name) + continue + } + return r.Header.Name, r.Attr + } + for _, r := range t.TimeCols { + if name != r.Header.Name { + // log.Info("skip sint row:", r.Header.Name, "!=", name) + continue + } + return r.Header.Name, r.Attr + } + return "", nil +}