remove symbols as length notation

main
Matthew Butterick 5 years ago
parent 95a4d85cb8
commit a4255af04d

@ -75,9 +75,10 @@ https://github.com/mbutterick/restructure/blob/master/test/Struct.coffee
"dict: support pre-encode hook" "dict: support pre-encode hook"
(parameterize ([current-output-port (open-output-bytes)]) (parameterize ([current-output-port (open-output-bytes)])
(define struct (x:dict #:pre-encode (λ (val) (define struct (x:dict #:pre-encode (λ (val)
(hash-set! val 'nameLength (string-length (hash-ref val 'name))) val) (hash-set! val 'nameLength (string-length (hash-ref val 'name)))
val)
'nameLength uint8 'nameLength uint8
'name (x:string 'nameLength) 'name (x:string (λ (this) (hash-ref this 'nameLength)))
'age uint8)) 'age uint8))
(encode struct (mhasheq 'name "roxyb" 'age 21)) (encode struct (mhasheq 'name "roxyb" 'age 21))
(check-equal? (get-output-bytes (current-output-port)) #"\x05roxyb\x15"))) (check-equal? (get-output-bytes (current-output-port)) #"\x05roxyb\x15")))

@ -80,8 +80,8 @@ https://github.com/mbutterick/restructure/blob/master/test/VersionedStruct.coffe
'gender 0))))) 'gender 0)))))
(test-case (test-case
"versioned dict: decode should support parent version key" "versioned dict: decode should support parent version key via procedure"
(let ([vstruct (x:versioned-dict x:version-key (let ([vstruct (x:versioned-dict (λ (p) (hash-ref p x:version-key))
(dictify (dictify
0 (dictify 'name (x:string #:length uint8 #:encoding 'ascii) 0 (dictify 'name (x:string #:length uint8 #:encoding 'ascii)
'age uint8) 'age uint8)

@ -6,7 +6,6 @@
(or (not x) (or (not x)
(exact-nonnegative-integer? x) (exact-nonnegative-integer? x)
(procedure? x) (procedure? x)
(symbol? x)
(x:int? x))) (x:int? x)))
(define (resolve-length x input-port [parent #f]) (define (resolve-length x input-port [parent #f])

@ -1,6 +1,7 @@
#lang debug racket/base #lang debug racket/base
(require "base.rkt" (require "base.rkt"
"dict.rkt" "dict.rkt"
"util.rkt"
racket/dict racket/dict
racket/match racket/match
racket/class racket/class
@ -14,8 +15,7 @@ https://github.com/mbutterick/restructure/blob/master/src/VersionedStruct.coffee
|# |#
(define (version-type? x) (define (version-type? x)
(for/or ([proc (list integer? procedure? xenomorphic? symbol?)]) (and x (length-resolvable? x)))
(proc x)))
(define x:versioned-dict% (define x:versioned-dict%
(class x:dict% (class x:dict%
@ -25,7 +25,7 @@ https://github.com/mbutterick/restructure/blob/master/src/VersionedStruct.coffee
[(@version-key version-key)]) [(@version-key version-key)])
(unless (version-type? @type) (unless (version-type? @type)
(raise-argument-error 'x:versioned-dict "integer, procedure, symbol, or xenomorphic" @type)) (raise-argument-error 'x:versioned-dict "integer, procedure, or xenomorphic" @type))
(unless (and (dict? @versions) (andmap (λ (v) (or (dict? v) (x:dict? v))) (dict-values @versions))) (unless (and (dict? @versions) (andmap (λ (v) (or (dict? v) (x:dict? v))) (dict-values @versions)))
(raise-argument-error 'x:versioned-dict "dict of dicts or structish" @versions)) (raise-argument-error 'x:versioned-dict "dict of dicts or structish" @versions))
@ -43,7 +43,6 @@ https://github.com/mbutterick/restructure/blob/master/src/VersionedStruct.coffee
(define res (setup-private-fields port parent length)) (define res (setup-private-fields port parent length))
(define which-version (match @type (define which-version (match @type
[(? integer? int) int] [(? integer? int) int]
[(? symbol? key) #:when parent (dict-ref parent key)]
[(? procedure? proc) #:when parent (proc parent)] [(? procedure? proc) #:when parent (proc parent)]
[(or (? symbol?) (? procedure?)) [(or (? symbol?) (? procedure?))
(raise-argument-error 'decode "valid parent" parent)] (raise-argument-error 'decode "valid parent" parent)]

Loading…
Cancel
Save