]> Cypherpunks repositories - keks.git/commitdiff
TIMEMAXPREC support in Go
authorSergey Matveev <stargrave@stargrave.org>
Fri, 4 Apr 2025 10:06:13 +0000 (13:06 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Fri, 4 Apr 2025 12:48:34 +0000 (15:48 +0300)
go/schema/check.go

index 6b48831571529866d49e158d2d8db0b5a8ece01988cb8181d2910d3d031db567..6ea0df1ae9e53f0c356477ae44d7fbf39f2a74b2c84ce1974953aac8e42d3899 100644 (file)
@@ -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)
                }