From 498c63ef67b7037328f01983c2e9aace8d7edb1a Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Tue, 1 Jun 2021 16:46:23 +0200 Subject: [PATCH] Repair embedded reading; and preserve annotations in generic embedded values --- .../javascript/packages/core/src/decoder.ts | 3 ++- .../javascript/packages/core/src/embedded.ts | 3 ++- .../javascript/packages/core/src/embeddedTypes.ts | 4 ++-- .../javascript/packages/core/src/reader.ts | 7 ++++--- .../javascript/packages/schema/src/reader.ts | 2 +- .../javascript/packages/schema/test/reader.test.ts | 12 +++++++++++- 6 files changed, 22 insertions(+), 9 deletions(-) diff --git a/implementations/javascript/packages/core/src/decoder.ts b/implementations/javascript/packages/core/src/decoder.ts index cf0058c..f5316c1 100644 --- a/implementations/javascript/packages/core/src/decoder.ts +++ b/implementations/javascript/packages/core/src/decoder.ts @@ -8,6 +8,7 @@ import { Bytes, BytesLike, underlying } from "./bytes"; import { Value } from "./values"; import { is } from "./is"; import { embed, GenericEmbedded, Embedded, EmbeddedTypeDecode } from "./embedded"; +import { ReaderStateOptions } from "reader"; export interface DecoderOptions { includeAnnotations?: boolean; @@ -166,7 +167,7 @@ export const neverEmbeddedTypeDecode: EmbeddedTypeDecode = { throw new Error("Embeddeds not permitted at this point in Preserves document"); }, - fromValue(_v: Value): never { + fromValue(_v: Value, _options: ReaderStateOptions): never { throw new Error("Embeddeds not permitted at this point in Preserves document"); }, }; diff --git a/implementations/javascript/packages/core/src/embedded.ts b/implementations/javascript/packages/core/src/embedded.ts index f5ee18c..f098191 100644 --- a/implementations/javascript/packages/core/src/embedded.ts +++ b/implementations/javascript/packages/core/src/embedded.ts @@ -1,6 +1,7 @@ import type { EncoderState } from "./encoder"; import type { DecoderState } from "./decoder"; import type { Value } from "./values"; +import { ReaderStateOptions } from "./reader"; export type EmbeddedTypeEncode = { encode(s: EncoderState, v: T): void; @@ -9,7 +10,7 @@ export type EmbeddedTypeEncode = { export type EmbeddedTypeDecode = { decode(s: DecoderState): T; - fromValue(v: Value): T; + fromValue(v: Value, options: ReaderStateOptions): T; } export type EmbeddedType = EmbeddedTypeEncode & EmbeddedTypeDecode; diff --git a/implementations/javascript/packages/core/src/embeddedTypes.ts b/implementations/javascript/packages/core/src/embeddedTypes.ts index fc93a55..6ce685c 100644 --- a/implementations/javascript/packages/core/src/embeddedTypes.ts +++ b/implementations/javascript/packages/core/src/embeddedTypes.ts @@ -1,6 +1,6 @@ import { GenericEmbedded, EmbeddedType, EmbeddedTypeDecode, EmbeddedTypeEncode } from "./embedded"; import { Encoder, EncoderState, identityEmbeddedTypeEncode } from "./encoder"; -import { genericEmbeddedTypeDecode } from "./reader"; +import { genericEmbeddedTypeDecode, ReaderStateOptions } from "./reader"; import { Value } from "./values"; import { DecoderState, neverEmbeddedTypeDecode } from "./decoder"; @@ -39,7 +39,7 @@ export const identityEmbeddedTypeDecode: EmbeddedTypeDecode = { throw new Error("Cannot decode identityEmbeddedType"); }, - fromValue(_v: Value): any { + fromValue(_v: Value, _options: ReaderStateOptions): any { throw new Error("Cannot decode identityEmbeddedType"); }, }; diff --git a/implementations/javascript/packages/core/src/reader.ts b/implementations/javascript/packages/core/src/reader.ts index 8032792..75b5e14 100644 --- a/implementations/javascript/packages/core/src/reader.ts +++ b/implementations/javascript/packages/core/src/reader.ts @@ -280,8 +280,8 @@ export const genericEmbeddedTypeDecode: EmbeddedTypeDecode = { return new GenericEmbedded(new Decoder(s, this).next()); }, - fromValue(v: Value): GenericEmbedded { - return new GenericEmbedded(strip(v)); + fromValue(v: Value, options: ReaderStateOptions): GenericEmbedded { + return new GenericEmbedded(options.includeAnnotations ? v : strip(v)); }, }; @@ -393,7 +393,8 @@ export class Reader { }); } case '!': return embed(this.embeddedType.fromValue( - new Reader(this.state, genericEmbeddedTypeDecode).next())); + new Reader(this.state, genericEmbeddedTypeDecode).next(), + this.state.options)); default: this.state.error(`Invalid # syntax: ${c}`, startPos); } diff --git a/implementations/javascript/packages/schema/src/reader.ts b/implementations/javascript/packages/schema/src/reader.ts index ba4bccb..a5d0875 100644 --- a/implementations/javascript/packages/schema/src/reader.ts +++ b/implementations/javascript/packages/schema/src/reader.ts @@ -259,7 +259,7 @@ function parsePattern(name: symbol, body0: Array): Pattern { } else if (isCompound(item)) { return kf(); } else if (isEmbedded(item)) { - return ks(M.SimplePattern.embedded(walkSimple(item.embeddedValue))); + return ks(M.SimplePattern.embedded(walkSimple(item.embeddedValue.generic))); } else { return ks(M.SimplePattern.lit(strip(item))); } diff --git a/implementations/javascript/packages/schema/test/reader.test.ts b/implementations/javascript/packages/schema/test/reader.test.ts index 29ca944..4d5d55d 100644 --- a/implementations/javascript/packages/schema/test/reader.test.ts +++ b/implementations/javascript/packages/schema/test/reader.test.ts @@ -1,4 +1,4 @@ -import { readSchema } from '../src/index'; +import { readSchema, Meta } from '../src/index'; describe('reader schema', () => { it('complains about bad version', () => { @@ -13,4 +13,14 @@ describe('reader schema', () => { expect(s.definitions.size).toBe(0); expect(s.embeddedType._variant).toBe('false'); }); + it('understands patterns under embed', () => { + const s = readSchema('version 1 . X = #!0 .'); + const def: Meta.Definition = s.definitions.get(Symbol.for('X'))!; + if (def._variant !== 'Pattern') fail('bad definition 1'); + if (def.value._variant !== 'SimplePattern') fail ('bad definition 2'); + if (def.value.value._variant !== 'embedded') fail('bad definition 3'); + const i = def.value.value.interface; + if (i._variant !== 'lit') fail('Non-tuple embedded pattern'); + expect(i.value).toBe(0); + }); });