homemanager-be/src/app-building/plan-renderer/renderer/plan-validators.ts

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;