@platform/cell.typesystem
Version:
The 'strongly typed sheets' system of the CellOS.
71 lines (70 loc) • 2.22 kB
JavaScript
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);