diff --git a/xenomorph/xenomorph/struct.rkt b/xenomorph/xenomorph/struct.rkt index 9395521c..ee22632e 100644 --- a/xenomorph/xenomorph/struct.rkt +++ b/xenomorph/xenomorph/struct.rkt @@ -42,13 +42,16 @@ https://github.com/mbutterick/restructure/blob/master/src/Struct.coffee (define h (make-hasheq)) (for ([(k v) (in-dict x)] #:unless (memq k private-keys)) - (hash-set! h k v)) + (hash-set! h k v)) h) (define xstruct% (class xenobase% (super-new) (init-field [(@fields fields)]) + + (when @fields (unless (dict? @fields) + (raise-argument-error '+xstruct "dict" @fields))) (define/augride (xxdecode port parent [len 0]) ;; xstruct-setup and xstruct-parse-fields are separate to cooperate with VersionedStruct @@ -76,9 +79,9 @@ https://github.com/mbutterick/restructure/blob/master/src/Struct.coffee 'pointerSize 0)) (dict-set! parent 'pointerOffset (+ (pos port) (xxsize val parent #f))) (for ([(key type) (in-dict @fields)]) - (send type xxencode (dict-ref val key) port parent)) + (send type xxencode (dict-ref val key) port parent)) (for ([ptr (in-list (dict-ref parent 'pointers))]) - (send (dict-ref ptr 'type) xxencode (dict-ref ptr 'val) port (dict-ref ptr 'parent)))) + (send (dict-ref ptr 'type) xxencode (dict-ref ptr 'val) port (dict-ref ptr 'parent)))) (define/augride (xxsize [val #f] [parent-arg #f] [include-pointers #t]) (define parent (mhasheq 'parent parent-arg @@ -86,7 +89,7 @@ https://github.com/mbutterick/restructure/blob/master/src/Struct.coffee 'pointerSize 0)) (define fields-size (for/sum ([(key type) (in-dict @fields)] #:when (xenomorphic-type? type)) - (send type xxsize (and val (dict-ref val key)) parent))) + (send type xxsize (and val (dict-ref val key)) parent))) (define pointers-size (if include-pointers (dict-ref parent 'pointerSize) 0)) (+ fields-size pointers-size)))) @@ -97,11 +100,9 @@ https://github.com/mbutterick/restructure/blob/master/src/Struct.coffee (unless (even? (length args)) (raise-argument-error '+xstruct "equal number of keys and values" dicts)) (define fields (for/list ([kv (in-slice 2 args)]) - (unless (symbol? (car kv)) - (raise-argument-error '+xstruct "symbol" (car kv))) - (apply cons kv))) - (unless (dict? fields) - (raise-argument-error '+xstruct "dict" fields)) + (unless (symbol? (car kv)) + (raise-argument-error '+xstruct "symbol" (car kv))) + (apply cons kv))) (new class [fields fields])) (module+ test @@ -109,15 +110,15 @@ https://github.com/mbutterick/restructure/blob/master/src/Struct.coffee (define (random-pick xs) (list-ref xs (random (length xs)))) (check-exn exn:fail:contract? (λ () (+xstruct 42))) (for ([i (in-range 20)]) - ;; make random structs and make sure we can round trip - (define field-types - (for/list ([i (in-range 40)]) - (random-pick (list uint8 uint16be uint16le uint32be uint32le double)))) - (define size-num-types - (for/sum ([num-type (in-list field-types)]) - (size num-type))) - (define xs (+xstruct (for/list ([num-type (in-list field-types)]) - (cons (gensym) num-type)))) - (define bs (apply bytes (for/list ([i (in-range size-num-types)]) - (random 256)))) - (check-equal? (encode xs (decode xs bs) #f) bs))) \ No newline at end of file + ;; make random structs and make sure we can round trip + (define field-types + (for/list ([i (in-range 40)]) + (random-pick (list uint8 uint16be uint16le uint32be uint32le double)))) + (define size-num-types + (for/sum ([num-type (in-list field-types)]) + (size num-type))) + (define xs (+xstruct (for/list ([num-type (in-list field-types)]) + (cons (gensym) num-type)))) + (define bs (apply bytes (for/list ([i (in-range size-num-types)]) + (random 256)))) + (check-equal? (encode xs (decode xs bs) #f) bs))) \ No newline at end of file