summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2025-09-14 09:35:54 -0500
committerJeff Carr <[email protected]>2025-09-14 09:35:54 -0500
commit621ddb1b86ed39aca9cff0450461e390b2dd4281 (patch)
tree9b9ef027b2a110861d86e3af8f67cf80330e7244
parent907fea439261c5b51cfc086a0e2c2689b826b103 (diff)
made a standard TableRow() function
-rw-r--r--humanTable.go31
-rw-r--r--tablePB.go174
2 files changed, 116 insertions, 89 deletions
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,122 +23,119 @@ 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)
+ 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)
+
+ 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")
+ }
}
+ line, fmtline := StandardTableRow(sizes, cells)
+ if os.Getenv("TABLEPB_VERBOSE") == "true" {
+ line += "FMT: " + fmtline
+ }
+ log.Info(line)
+ }
+}
- w += 1
+func makeGridLabel(pb *guipb.Widget, w int, h int) {
+ log.Info("MAKE GRID LABEL", w, h, pb.Name)
+}
+
+func extractInt64(anyVal *anypb.Any) (int64, error) {
+ val := &wrapperspb.Int64Value{}
+ if err := anyVal.UnmarshalTo(val); err != nil {
+ return 0, err
}
+ return val.Value, nil
}
-func addTableRow(t *guipb.Table, name string, w int) bool {
- var h int = 0
- for _, r := range t.StringRows {
+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("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
+ // log.Info("Cell value:", r.Vals[row])
+ return r.Vals[row], true
}
-
- for _, r := range t.ButtonRows {
+ for _, r := range t.ButtonCols {
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
+ // 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 true
+ return fmt.Sprintf("%d", r.Vals[row]), true
}
-
- for _, r := range t.IntRows {
+ for _, r := range t.TimeCols {
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)
- }
- 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
+ cellTime := r.Vals[row]
+ s := shell.FormatDuration(time.Since(cellTime.AsTime()))
+ return s, true
}
+ return "", false
+}
- for _, r := range t.TimeRows {
+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 {
- // 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 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 true
+ return r.Header.Name, r.Attr
}
-
- return false
-}
-
-func makeGridLabel(pb *guipb.Widget, w int, h int) {
- log.Info("MAKE GRID LABEL", w, h, pb.Name)
-}
-
-func extractInt64(anyVal *anypb.Any) (int64, error) {
- val := &wrapperspb.Int64Value{}
- if err := anyVal.UnmarshalTo(val); err != nil {
- return 0, err
+ 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
}
- return val.Value, nil
+ 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
}