summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2025-09-15 03:51:54 -0500
committerJeff Carr <[email protected]>2025-09-15 03:51:54 -0500
commitb53d68d6b80081c4459e9d4a44d4059153e211dc (patch)
tree011a28feeb1f91f94286fd4313d4abad6f737ba6
parentbd897e4edb60fbaf282ca0d71b99b89d30b6d3dc (diff)
continue work on testing using 'any' in GUI PB
-rw-r--r--README.md22
-rw-r--r--tablePB.go71
2 files changed, 74 insertions, 19 deletions
diff --git a/README.md b/README.md
index 53cdd75..f2124c4 100644
--- a/README.md
+++ b/README.md
@@ -1,27 +1,11 @@
// Copyright 2025 WIT.COM Inc Licensed GPL 3.0
-// you can replace all of COBOL with this amount of GO
-
// ah yes, COBOL. what an ancient throwback. for those that know
// then you know exactly what is in this file. For those that don't, here it is:
// All this does is output human readable text formatted to be viewable on
// a console with a fixed with font. AKA: a typerwriter. Which is exactly
-// what COBOL did in the 1970's (60s? notsure) And the 80s.
-
-// So, you want to dump out stuff on the console. Let's see. Something like
-
-/*
- forge --favorites
-
- go.wit.com/apps/myapp v0.2.0 (installed)
- go.wit.com/lib/somethingfun v0.0.7 (not downloaded)
-*/
-
-// anyway, you get the idea. This is also called COBOL because it does
-// truncate every line output to the columns you see with stty -a
-// my monitor is huge, so it's not going to work at 80x24. 160x48 is better
-// actually, I'd predict some of these will probably end up 240 wide
-// long live good eyesight and 4K monitors!
+// what COBOL did in the 1970's (60s? notsure). And the 80s.
-// TODO: fix this to truncate with stty cols width
+// Perl, before GO, was great for this kinda thing. GO with
+// protobuffers is even better
diff --git a/tablePB.go b/tablePB.go
index 98aa6db..39907a3 100644
--- a/tablePB.go
+++ b/tablePB.go
@@ -11,6 +11,7 @@ import (
"go.wit.com/lib/protobuf/guipb"
"go.wit.com/log"
"google.golang.org/protobuf/types/known/anypb"
+ "google.golang.org/protobuf/types/known/timestamppb"
"google.golang.org/protobuf/types/known/wrapperspb"
)
@@ -34,6 +35,9 @@ func PrintTable(pb *guipb.Table) {
var sizes []int
for _, name := range pb.Order {
arg, attr, tmp := getColAttr(pb, name)
+ if attr == nil {
+ continue
+ }
HEIGHT = tmp
args = append(args, arg)
if attr.Width == 0 {
@@ -49,6 +53,11 @@ func PrintTable(pb *guipb.Table) {
for i := range HEIGHT {
var cells []string
for _, name := range pb.Order {
+ if val, ok := getAnyCell(pb, name, int(i)); ok {
+ h += 1
+ cells = append(cells, val)
+ continue
+ }
if val, ok := getTableCell(pb, name, int(i)); ok {
// log.Info("tree: CELL GOOD", pb.Title, name, w, h, val)
h += 1
@@ -112,6 +121,61 @@ func getTableCell(t *guipb.Table, name string, row int) (string, bool) {
s := shell.FormatDuration(time.Since(cellTime.AsTime()))
return s, true
}
+ for _, r := range t.AnyCols {
+ 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 "fixme", true
+ }
+ return "", false
+}
+
+func getAnyCell(t *guipb.Table, name string, row int) (string, bool) {
+ for _, col := range t.AnyCols {
+ if name != col.Header.Name {
+ // log.Info("skip sint row:", r.Header.Name, "!=", name)
+ continue
+ }
+ anyVal := col.Vals[row]
+
+ switch col.Attr.Type {
+ case guipb.ColAttr_STRING:
+ // return col.Vals[row] true
+ case guipb.ColAttr_INT:
+ var finalInt int32
+ // 1. Check if the Any contains an Int32Value
+ if anyVal.MessageIs(&wrapperspb.Int32Value{}) {
+ var intValue wrapperspb.Int32Value
+ // 2. Unmarshal into the wrapper
+ if err := anyVal.UnmarshalTo(&intValue); err == nil {
+ // 3. Get the native Go int32 from the wrapper
+ finalInt = intValue.GetValue()
+ }
+ }
+
+ return fmt.Sprintf("%d", finalInt), true
+ case guipb.ColAttr_DURATION:
+ case guipb.ColAttr_TIME:
+ var sout string
+ var tsProto timestamppb.Timestamp
+ if err := anyVal.UnmarshalTo(&tsProto); err == nil {
+ // It's a timestamp, now convert it back to a Go time.Time
+ goTime := tsProto.AsTime()
+ // fmt.Printf("Successfully unpacked timestamp: %v\n", goTime)
+ sout = shell.FormatDuration(time.Since(goTime))
+ return sout, true
+ }
+ return "", false
+ default:
+ log.Info("cell unhandled type", col.Attr.Type)
+ }
+ // cellTime := r.Vals[row]
+ // s := shell.FormatDuration(time.Since(cellTime.AsTime()))
+ return "fixme", true
+ }
return "", false
}
@@ -144,5 +208,12 @@ func getColAttr(t *guipb.Table, name string) (string, *guipb.ColAttr, int) {
}
return r.Header.Name, r.Attr, len(r.Vals)
}
+ for _, r := range t.AnyCols {
+ if name != r.Header.Name {
+ // log.Info("skip sint row:", r.Header.Name, "!=", name)
+ continue
+ }
+ return r.Header.Name, r.Attr, len(r.Vals)
+ }
return "", nil, 0
}