From cb03f99cf33a2b8fff6ebafeb9c8fe573f909a30c3a14ffd8d52ea6e9c8c8ac0 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Fri, 4 Apr 2025 13:06:13 +0300 Subject: [PATCH] TIMEMAXPREC support in Go --- go/schema/check.go | 116 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 108 insertions(+), 8 deletions(-) diff --git a/go/schema/check.go b/go/schema/check.go index 6b48831..6ea0df1 100644 --- a/go/schema/check.go +++ b/go/schema/check.go @@ -23,18 +23,20 @@ import ( "go.cypherpunks.su/tai64n/v4" "go.cypherpunks.su/keks" + "go.cypherpunks.su/keks/be" "go.cypherpunks.su/keks/types" ) const ( - CmdTake = "TAKE" - CmdEach = "EACH" - CmdExists = "EXISTS" - CmdNotExists = "!EXISTS" - CmdType = "TYPE" - CmdLT = "LT" - CmdGT = "GT" - CmdSchema = "SCHEMA" + CmdTake = "TAKE" + CmdEach = "EACH" + CmdExists = "EXISTS" + CmdNotExists = "!EXISTS" + CmdType = "TYPE" + CmdLT = "LT" + CmdGT = "GT" + CmdSchema = "SCHEMA" + CmdTimeMaxPrec = "TIMEMAXPREC" Magic = "schema" ) @@ -247,6 +249,104 @@ func Check(schemaName string, schemas map[string][][]any, data any) error { return fmt.Errorf("%s: %d: %d: %s: %w", schemaName, i, n, cmd, err) } } + case CmdTimeMaxPrec: + if vs == nil { + continue + } + if len(act) != 2 { + return fmt.Errorf("%s: %d: %s: wrong number of args", schemaName, i, cmd) + } + prec, ok := act[1].(uint64) + if !ok { + return fmt.Errorf("%s: %d: %s: bad prec: %+v", schemaName, i, cmd, act[1]) + } + for _, v := range vs { + switch prec { + case 0: // s + if _, ok = v.(*tai64n.TAI64); !ok { + return fmt.Errorf("%s: %d: %s: >TAI64", schemaName, i, cmd) + } + case 3: // ms + if _, ok = v.(*tai64n.TAI64); ok { + continue + } + var tai *tai64n.TAI64N + tai, ok = v.(*tai64n.TAI64N) + if !ok { + return fmt.Errorf("%s: %d: %s: >TAI64N", schemaName, i, cmd) + } + d := be.Get(tai[8:]) + if d%1000000 != 0 { + return fmt.Errorf("%s: %d: %s: >ms", schemaName, i, cmd) + } + case 6: // µs + if _, ok = v.(*tai64n.TAI64); ok { + continue + } + var tai *tai64n.TAI64N + tai, ok = v.(*tai64n.TAI64N) + if !ok { + return fmt.Errorf("%s: %d: %s: >TAI64N", schemaName, i, cmd) + } + d := be.Get(tai[8:]) + if d%1000 != 0 { + return fmt.Errorf("%s: %d: %s: >µs", schemaName, i, cmd) + } + case 9: // ns + if _, ok = v.(*tai64n.TAI64); ok { + continue + } + if _, ok = v.(*tai64n.TAI64N); !ok { + return fmt.Errorf("%s: %d: %s: >TAI64N", schemaName, i, cmd) + } + case 12: // ps + if _, ok = v.(*tai64n.TAI64); ok { + continue + } + if _, ok = v.(*tai64n.TAI64N); ok { + continue + } + var tai *tai64n.TAI64NA + tai, ok = v.(*tai64n.TAI64NA) + if !ok { + return fmt.Errorf("%s: %d: %s: non-TAI", schemaName, i, cmd) + } + d := be.Get(tai[12:]) + if d%1000000 != 0 { + return fmt.Errorf("%s: %d: %s: >ps", schemaName, i, cmd) + } + case 15: // fs + if _, ok = v.(*tai64n.TAI64); ok { + continue + } + if _, ok = v.(*tai64n.TAI64N); ok { + continue + } + var tai *tai64n.TAI64NA + tai, ok = v.(*tai64n.TAI64NA) + if !ok { + return fmt.Errorf("%s: %d: %s: non-TAI", schemaName, i, cmd) + } + d := be.Get(tai[12:]) + if d%1000 != 0 { + return fmt.Errorf("%s: %d: %s: >fs", schemaName, i, cmd) + } + case 18: // as + if _, ok = v.(*tai64n.TAI64); ok { + continue + } + if _, ok = v.(*tai64n.TAI64N); ok { + continue + } + if _, ok = v.(*tai64n.TAI64NA); ok { + continue + } + return fmt.Errorf("%s: %d: %s: non-TAI", schemaName, i, cmd) + default: + return fmt.Errorf("%s: %d: %s: unknown value: %d", + schemaName, i, cmd, prec) + } + } default: return fmt.Errorf("%s: %d: %s: unknown command", schemaName, i, cmd) } -- 2.48.1