diff options
Diffstat (limited to 'lib/zambyte/meta/180.scm')
-rw-r--r-- | lib/zambyte/meta/180.scm | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/lib/zambyte/meta/180.scm b/lib/zambyte/meta/180.scm index 832e3e2..073b5e8 100644 --- a/lib/zambyte/meta/180.scm +++ b/lib/zambyte/meta/180.scm @@ -19,7 +19,7 @@ (assoc key obj) #t) (and (json-record? obj) - (json-object-contains-key? (json-record->fields obj) key)))) + (json-object-contains-key? ((json-record->typeless obj)) key)))) (define (string->json str) (call-with-port (open-input-string str) @@ -40,8 +40,12 @@ (cdr pair) ((json-key-not-found))))) ((json-record? json) - (json-object-ref (json-record->fields json) key)) - (else ((key-not-found))))) + (or (and-let* ((pair (assoc key (json-record->mutators json))) + (accessor (cdr pair))) + (accessor (json-record->internal-record json) value) + json) + (error "json-object-ref: no accessor for field" (json-record->name json) key))) + (else ((json-key-not-found))))) (define (json-object-set! json key value) (cond @@ -58,8 +62,9 @@ (append! json (list (cons key value)))) ((json-record? json) (or (and-let* ((pair (assoc key (json-record->mutators json))) - (mutator (cdr pair))) - (mutator json value)) + (mutator! (cdr pair))) + (mutator! (json-record->internal-record json) value) + json) (error "json-object-set!: no mutator for field" (json-record->name json) key))))) (define json-list-ref vector-ref) @@ -78,7 +83,7 @@ (define (json-object->alist obj) (cond ((list? obj) obj) - ((json-record? obj) (json-record->fields obj)) + ((json-record? obj) ((json-record->typeless obj))) (else (error "json-object->alist: not an object" obj)))) (define json-list->list vector->list)) |