UNPKG

@platform/cell.typesystem

Version:

The 'strongly typed sheets' system of the CellOS.

71 lines (70 loc) 2.22 kB
import { defaultValue, coord, value } from '../common'; import { TypeValue, TypeTarget } from '../TypeSystem.core'; export class TypeBuilderProp { constructor(args) { this._column = 0; this.column(args.column) .name(args.name) .type(defaultValue(args.type, 'string')) .target(args.target) .default(args.default); this._onChange = args.onChange; } get columnKey() { return coord.cell.toColumnKey(this._column) || 'A'; } toObject() { return value.deleteUndefined({ column: this.columnKey, name: this._name, type: this._type, target: this._target, default: this._default, }); } column(value) { const index = typeof value === 'number' ? value : coord.cell.toAxisIndex('COLUMN', value); if (index < 0) { const err = `The column "${value}" is invalid.`; throw new Error(err); } this._column = index; return this.fireChange('column', this.columnKey); } name(value) { this._name = value; return this.fireChange('name', value); } type(value) { value = (value || '').trim(); if (!value.startsWith('/')) { const parsed = TypeValue.parse(value); if (parsed.type.kind === 'UNKNOWN') { const err = `The type '${value}' is UNKNOWN`; throw new Error(err); } } this._type = value; return this.fireChange('type', value); } target(value) { const errors = TypeTarget.parse(value).errors; if (errors.length > 0) { const message = errors.map(err => err.message).join('\n'); throw new Error(message); } this._target = value; return this.fireChange('target', value); } default(value) { this._default = value; return this.fireChange('default', value); } fireChange(prop, value) { if (this._onChange) { this._onChange({ prop, value }); } return this; } } TypeBuilderProp.create = (args) => new TypeBuilderProp(args);