diff --git a/xenomorph/xenomorph/test/dict-test.rkt b/xenomorph/xenomorph/test/dict-test.rkt index 6428ed21..554dbfdd 100644 --- a/xenomorph/xenomorph/test/dict-test.rkt +++ b/xenomorph/xenomorph/test/dict-test.rkt @@ -26,14 +26,14 @@ https://github.com/mbutterick/restructure/blob/master/test/Struct.coffee (parameterize ([current-input-port (open-input-bytes #"\x05roxyb\x15\x05roxyb\x15")]) (check-equal? (decode (x:dict 'name (x:string #:length uint8) 'age uint8 - 'nested (x:dict 'name (x:string #:length uint8) 'age uint8))) + 'nested (x:dict 'name (x:string #:length uint8) 'age uint8))) (mhasheq 'name "roxyb" 'age 21 'nested (mhasheq 'name "roxyb" 'age 21))))) (test-case "dict: decode with process hook" (parameterize ([current-input-port (open-input-bytes #"\x05roxyb\x20")]) (define struct (x:dict #:post-decode (λ (o) (hash-set! o 'canDrink (>= (hash-ref o 'age) 21)) o) - 'name (x:string #:length uint8) 'age uint8)) + 'name (x:string #:length uint8) 'age uint8)) (check-equal? (decode struct) (mhasheq 'name "roxyb" 'age 32 'canDrink #t)))) @@ -52,9 +52,9 @@ https://github.com/mbutterick/restructure/blob/master/test/Struct.coffee (test-case "dict: compute the correct size with pointers" (check-equal? (send (x:dict 'name (x:string #:length uint8) - 'age uint8 - 'ptr (x:pointer #:type uint8 #:dest-type (x:string #:length uint8))) - x:size + 'age uint8 + 'ptr (x:pointer #:type uint8 #:dest-type (x:string #:length uint8))) + x:size (mhash 'name "roxyb" 'age 21 'ptr "hello")) 14)) (test-case @@ -75,10 +75,11 @@ https://github.com/mbutterick/restructure/blob/master/test/Struct.coffee "dict: support pre-encode hook" (parameterize ([current-output-port (open-output-bytes)]) (define struct (x:dict #:pre-encode (λ (val) - (hash-set! val 'nameLength (string-length (hash-ref val 'name))) val) - 'nameLength uint8 - 'name (x:string 'nameLength) - 'age uint8)) + (hash-set! val 'nameLength (string-length (hash-ref val 'name))) + val) + 'nameLength uint8 + 'name (x:string (λ (this) (hash-ref this 'nameLength))) + 'age uint8)) (encode struct (mhasheq 'name "roxyb" 'age 21)) (check-equal? (get-output-bytes (current-output-port)) #"\x05roxyb\x15"))) @@ -86,7 +87,7 @@ https://github.com/mbutterick/restructure/blob/master/test/Struct.coffee "dict: encode pointer data after structure" (parameterize ([current-output-port (open-output-bytes)]) (define struct (x:dict 'name (x:string #:length uint8) - 'age uint8 - 'ptr (x:pointer uint8 #:dest-type (x:string #:length uint8)))) + 'age uint8 + 'ptr (x:pointer uint8 #:dest-type (x:string #:length uint8)))) (encode struct (hasheq 'name "roxyb" 'age 21 'ptr "hello")) (check-equal? (get-output-bytes (current-output-port)) #"\x05roxyb\x15\x08\x05hello"))) \ No newline at end of file diff --git a/xenomorph/xenomorph/test/versioned-dict-test.rkt b/xenomorph/xenomorph/test/versioned-dict-test.rkt index 2c0ad682..afd6402e 100644 --- a/xenomorph/xenomorph/test/versioned-dict-test.rkt +++ b/xenomorph/xenomorph/test/versioned-dict-test.rkt @@ -80,8 +80,8 @@ https://github.com/mbutterick/restructure/blob/master/test/VersionedStruct.coffe 'gender 0))))) (test-case - "versioned dict: decode should support parent version key" - (let ([vstruct (x:versioned-dict x:version-key + "versioned dict: decode should support parent version key via procedure" + (let ([vstruct (x:versioned-dict (λ (p) (hash-ref p x:version-key)) (dictify 0 (dictify 'name (x:string #:length uint8 #:encoding 'ascii) 'age uint8) diff --git a/xenomorph/xenomorph/util.rkt b/xenomorph/xenomorph/util.rkt index 53282219..793c495c 100644 --- a/xenomorph/xenomorph/util.rkt +++ b/xenomorph/xenomorph/util.rkt @@ -6,7 +6,6 @@ (or (not x) (exact-nonnegative-integer? x) (procedure? x) - (symbol? x) (x:int? x))) (define (resolve-length x input-port [parent #f]) diff --git a/xenomorph/xenomorph/versioned-dict.rkt b/xenomorph/xenomorph/versioned-dict.rkt index 35bafef4..75992451 100644 --- a/xenomorph/xenomorph/versioned-dict.rkt +++ b/xenomorph/xenomorph/versioned-dict.rkt @@ -1,6 +1,7 @@ #lang debug racket/base (require "base.rkt" "dict.rkt" + "util.rkt" racket/dict racket/match racket/class @@ -14,8 +15,7 @@ https://github.com/mbutterick/restructure/blob/master/src/VersionedStruct.coffee |# (define (version-type? x) - (for/or ([proc (list integer? procedure? xenomorphic? symbol?)]) - (proc x))) + (and x (length-resolvable? x))) (define x:versioned-dict% (class x:dict% @@ -25,7 +25,7 @@ https://github.com/mbutterick/restructure/blob/master/src/VersionedStruct.coffee [(@version-key version-key)]) (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))) (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 which-version (match @type [(? integer? int) int] - [(? symbol? key) #:when parent (dict-ref parent key)] [(? procedure? proc) #:when parent (proc parent)] [(or (? symbol?) (? procedure?)) (raise-argument-error 'decode "valid parent" parent)] @@ -77,14 +76,14 @@ https://github.com/mbutterick/restructure/blob/master/src/VersionedStruct.coffee (send @type x:encode (dict-ref field-data @version-key #f) port parent)) (for ([(key type) (in-dict (dict-ref @versions 'header null))]) - (send type x:encode (dict-ref field-data key) port parent)) + (send type x:encode (dict-ref field-data key) port parent)) (define fields (select-field-set field-data)) (unless (andmap (λ (key) (member key (dict-keys field-data))) (dict-keys fields)) (raise-argument-error 'encode (format "hash that contains superset of xversioned-dict keys: ~a" (dict-keys fields)) (dict-keys field-data))) (for ([(key type) (in-dict fields)]) - (send type x:encode (dict-ref field-data key) port parent)) + (send type x:encode (dict-ref field-data key) port parent)) (let loop ([i 0]) (when (< i (length (dict-ref parent x:pointers-key))) @@ -107,11 +106,11 @@ https://github.com/mbutterick/restructure/blob/master/src/VersionedStruct.coffee (define header-size (for/sum ([(key type) (in-dict (dict-ref @versions 'header null))]) - (send type x:size (and val (dict-ref val key)) parent))) + (send type x:size (and val (dict-ref val key)) parent))) (define fields-size (for/sum ([(key type) (in-dict (select-field-set val))]) - (send type x:size (and val (send type pre-encode (dict-ref val key))) parent))) + (send type x:size (and val (send type pre-encode (dict-ref val key))) parent))) (define pointer-size (if include-pointers (dict-ref parent x:pointer-size-key) 0))