diff options
author | Nayeem Rahman <nayeemrmn99@gmail.com> | 2020-05-09 13:34:47 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-09 08:34:47 -0400 |
commit | f184332c09c851faac50f598d29ebe4426e05464 (patch) | |
tree | 2659aba63702537fcde1bb64ddeafea1e5863f3e /std/encoding/_yaml/schema.ts | |
parent | 2b02535028f868ea8dfc471c4921a237747ccd4a (diff) |
BREAKING(std): reorganization (#5087)
* Prepend underscores to private modules
* Remove collectUint8Arrays() It would be a misuse of Deno.iter()'s result.
* Move std/_util/async.ts to std/async
* Move std/util/sha*.ts to std/hash
Diffstat (limited to 'std/encoding/_yaml/schema.ts')
-rw-r--r-- | std/encoding/_yaml/schema.ts | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/std/encoding/_yaml/schema.ts b/std/encoding/_yaml/schema.ts new file mode 100644 index 000000000..579644dbb --- /dev/null +++ b/std/encoding/_yaml/schema.ts @@ -0,0 +1,101 @@ +// Ported from js-yaml v3.13.1: +// https://github.com/nodeca/js-yaml/commit/665aadda42349dcae869f12040d9b10ef18d12da +// Copyright 2011-2015 by Vitaly Puzrin. All rights reserved. MIT license. +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. + +import { YAMLError } from "./error.ts"; +import { KindType, Type } from "./type.ts"; +import { ArrayObject, Any } from "./utils.ts"; + +function compileList( + schema: Schema, + name: "implicit" | "explicit", + result: Type[] +): Type[] { + const exclude: number[] = []; + + for (const includedSchema of schema.include) { + result = compileList(includedSchema, name, result); + } + + for (const currentType of schema[name]) { + for ( + let previousIndex = 0; + previousIndex < result.length; + previousIndex++ + ) { + const previousType = result[previousIndex]; + if ( + previousType.tag === currentType.tag && + previousType.kind === currentType.kind + ) { + exclude.push(previousIndex); + } + } + + result.push(currentType); + } + + return result.filter((type, index): unknown => !exclude.includes(index)); +} + +export type TypeMap = { [k in KindType | "fallback"]: ArrayObject<Type> }; +function compileMap(...typesList: Type[][]): TypeMap { + const result: TypeMap = { + fallback: {}, + mapping: {}, + scalar: {}, + sequence: {}, + }; + + for (const types of typesList) { + for (const type of types) { + if (type.kind !== null) { + result[type.kind][type.tag] = result["fallback"][type.tag] = type; + } + } + } + return result; +} + +export class Schema implements SchemaDefinition { + public static SCHEMA_DEFAULT?: Schema; + + public implicit: Type[]; + public explicit: Type[]; + public include: Schema[]; + + public compiledImplicit: Type[]; + public compiledExplicit: Type[]; + public compiledTypeMap: TypeMap; + + constructor(definition: SchemaDefinition) { + this.explicit = definition.explicit || []; + this.implicit = definition.implicit || []; + this.include = definition.include || []; + + for (const type of this.implicit) { + if (type.loadKind && type.loadKind !== "scalar") { + throw new YAMLError( + // eslint-disable-next-line max-len + "There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported." + ); + } + } + + this.compiledImplicit = compileList(this, "implicit", []); + this.compiledExplicit = compileList(this, "explicit", []); + this.compiledTypeMap = compileMap( + this.compiledImplicit, + this.compiledExplicit + ); + } + + public static create(): void {} +} + +export interface SchemaDefinition { + implicit?: Any[]; + explicit?: Type[]; + include?: Schema[]; +} |