51 lines
1.7 KiB
TypeScript
51 lines
1.7 KiB
TypeScript
import { isValidColor } from 'src/shared/utils/validator.utils';
|
|
import {
|
|
Vec2,
|
|
Line,
|
|
BezierSegment,
|
|
LayerObject,
|
|
Layer,
|
|
} from './renderer.interfaces';
|
|
|
|
export const isValidVec2 = (subject: Vec2) =>
|
|
Array.isArray(subject) &&
|
|
subject.length === 2 &&
|
|
subject.every((entry) => !isNaN(entry));
|
|
|
|
export const isValidLine = (subject: Line) =>
|
|
// Segments must be array
|
|
Array.isArray(subject.segments) &&
|
|
// Every segment must contain at least a valid end point
|
|
subject.segments.every((segment) => {
|
|
// Check segment vector
|
|
if (segment.start && !isValidVec2(segment.start)) return false;
|
|
if (!segment.end || !isValidVec2(segment.end)) return false;
|
|
// Check bezier vector
|
|
const bezier = segment as BezierSegment;
|
|
if (bezier.startControl && !isValidVec2(bezier.startControl)) return false;
|
|
if (bezier.endControl && !isValidVec2(bezier.endControl)) return false;
|
|
return true;
|
|
}) &&
|
|
// Color must be a valid color value
|
|
isValidColor(subject.color) &&
|
|
// Closed must be a boolean
|
|
(subject.closed == null || typeof subject.closed === 'boolean');
|
|
|
|
export const isValidLayerObject = (object: LayerObject) =>
|
|
// Must be of correct type
|
|
['line', 'room', 'curve', 'object'].includes(object.type) &&
|
|
// If has segments, must be a valid line
|
|
(!(object as Line).segments || isValidLine(object as Line)) &&
|
|
// Name must be present
|
|
object.name != null;
|
|
|
|
export const isValidLayer = (layer: Layer) =>
|
|
// Must have correct color value
|
|
isValidColor(layer.color) &&
|
|
// Must have contents
|
|
Array.isArray(layer.contents) &&
|
|
// Must have valid contents
|
|
layer.contents.every(isValidLayerObject) &&
|
|
// Must be named
|
|
layer.name != null;
|