From: Sergey Matveev Date: Fri, 4 Apr 2025 13:08:27 +0000 (+0300) Subject: Do not require TAI64 left X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=e72a14e2a43dbe0fded11381980d6be75b546b7852bedc17c5f8a2a0737f9a14;p=keks.git Do not require TAI64 left --- diff --git a/go/cm/cmd/sigtool/main.go b/go/cm/cmd/sigtool/main.go index 3ce84cb..7ceaff5 100644 --- a/go/cm/cmd/sigtool/main.go +++ b/go/cm/cmd/sigtool/main.go @@ -88,7 +88,7 @@ func main() { if t != types.Magic || decoder.Iter().Magic() != sign.SignedMagic { log.Fatal("wrong magic") } - decoder = keks.NewDecoderFromReader(stdin, &keks.DecodeOpts{LeaveTAI64: true}) + decoder = keks.NewDecoderFromReader(stdin, nil) var v any v, err = decoder.Decode() if err != nil { @@ -130,7 +130,7 @@ func main() { log.Fatal(err) } } - decoder = keks.NewDecoderFromReader(stdin, &keks.DecodeOpts{LeaveTAI64: true}) + decoder = keks.NewDecoderFromReader(stdin, nil) v, err = decoder.Decode() if err != nil { log.Fatal(err) diff --git a/go/cm/sign/pub.go b/go/cm/sign/pub.go index b55060e..6df41da 100644 --- a/go/cm/sign/pub.go +++ b/go/cm/sign/pub.go @@ -63,7 +63,7 @@ func PubParse(data []byte) (signed *Signed, tail []byte, err error) { return } } - d := keks.NewDecoderFromBytes(data, &keks.DecodeOpts{LeaveTAI64: true}) + d := keks.NewDecoderFromBytes(data, nil) { var v any v, err = d.Decode() diff --git a/go/cm/sign/signed.go b/go/cm/sign/signed.go index 6796841..f24ced7 100644 --- a/go/cm/sign/signed.go +++ b/go/cm/sign/signed.go @@ -75,7 +75,7 @@ func Parse(data []byte) (signed *Signed, tail []byte, err error) { return } } - d := keks.NewDecoderFromBytes(data, &keks.DecodeOpts{LeaveTAI64: true}) + d := keks.NewDecoderFromBytes(data, nil) { var v any v, err = d.Decode() diff --git a/go/cmd/schema-validate/main.go b/go/cmd/schema-validate/main.go index c201e87..1b25b8c 100644 --- a/go/cmd/schema-validate/main.go +++ b/go/cmd/schema-validate/main.go @@ -54,7 +54,7 @@ func main() { log.Fatal(err) } - d = keks.NewDecoderFromBytes(dataRaw, &keks.DecodeOpts{LeaveTAI64: true}) + d = keks.NewDecoderFromBytes(dataRaw, nil) data, err := d.Decode() if err != nil { log.Fatal(err) diff --git a/go/schema/check.go b/go/schema/check.go index 6ea0df1..a147234 100644 --- a/go/schema/check.go +++ b/go/schema/check.go @@ -19,6 +19,7 @@ import ( "errors" "fmt" "slices" + "time" "go.cypherpunks.su/tai64n/v4" @@ -171,6 +172,8 @@ func Check(schemaName string, schemas map[string][][]any, data any) error { typ = types.TAI64N case *tai64n.TAI64NA: typ = types.TAI64NA + case time.Time: + typ = types.TAI64N case keks.Magic: typ = types.Magic case []byte: @@ -261,87 +264,87 @@ func Check(schemaName string, schemas map[string][][]any, data any) error { return fmt.Errorf("%s: %d: %s: bad prec: %+v", schemaName, i, cmd, act[1]) } for _, v := range vs { + switch v := v.(type) { + case *tai64n.TAI64: + case *tai64n.TAI64N: + case *tai64n.TAI64NA: + case time.Time: + default: + return fmt.Errorf("%s: %d: %s: unsupported data type: %T", + schemaName, i, cmd, v) + } switch prec { case 0: // s - if _, ok = v.(*tai64n.TAI64); !ok { - return fmt.Errorf("%s: %d: %s: >TAI64", schemaName, i, cmd) + switch v := v.(type) { + case *tai64n.TAI64: + case time.Time: + if v.Nanosecond() != 0 { + return fmt.Errorf("%s: %d: %s: >s", schemaName, i, cmd) + } + default: + return fmt.Errorf("%s: %d: %s: >s", 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 { + switch v := v.(type) { + case *tai64n.TAI64: + case *tai64n.TAI64N: + d := be.Get(v[8:]) + if d%1000000 != 0 { + return fmt.Errorf("%s: %d: %s: >ms", schemaName, i, cmd) + } + case time.Time: + if v.Nanosecond()%1000000 != 0 { + return fmt.Errorf("%s: %d: %s: >ms", schemaName, i, cmd) + } + default: 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 { + switch v := v.(type) { + case *tai64n.TAI64: + case *tai64n.TAI64N: + d := be.Get(v[8:]) + if d%1000 != 0 { + return fmt.Errorf("%s: %d: %s: >µs", schemaName, i, cmd) + } + case time.Time: + if v.Nanosecond()%1000 != 0 { + return fmt.Errorf("%s: %d: %s: >µs", schemaName, i, cmd) + } + default: 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) + switch v.(type) { + case *tai64n.TAI64: + case *tai64n.TAI64N: + case time.Time: + default: + return fmt.Errorf("%s: %d: %s: >ns", 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) + switch v := v.(type) { + case time.Time: + case *tai64n.TAI64: + case *tai64n.TAI64N: + case *tai64n.TAI64NA: + d := be.Get(v[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) + switch v := v.(type) { + case time.Time: + case *tai64n.TAI64: + case *tai64n.TAI64N: + case *tai64n.TAI64NA: + d := be.Get(v[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)