"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"
)
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)
}