@thangk/easythemer
Version:
Easily generate shades from a colour palette for use in your app
102 lines (85 loc) • 2.62 kB
text/typescript
import type { HSL } from "../types";
import { HSL_LIMITS, TYPE } from "../constants";
/**
* Validates HSL values
* @param hslInput HSL values to validate
* @getters getResult(), getHSLInput(), hasErrors(), getErrorsList()
* @result HSL values object or null
*/
export default class ValidateHSLValues {
private result: HSL | null = null;
private errors: boolean = false;
private errmsg: string[] = [];
private hslInput: HSL = { type: TYPE.HSL, h: -1, s: -1, l: -1 }; // default returns error to validation
constructor(hslInput: HSL) {
this.hslInput = hslInput;
if (this.isHueOutOfRange() || this.isSaturationOutOfRange() || this.isLightnessOutOfRange()) {
this.setErrorState();
return;
}
const regex = /^[0-9]*$/;
for (const [key, value] of Object.entries(this.hslInput)) {
if (!regex.test(value.toString())) {
this.setErrorState();
this.addError(`${key.toUpperCase()} value must be a number.`);
}
}
this.result = this.errors ? null : this.hslInput;
}
get getResult() {
return this.result;
}
get getHSLInput() {
return this.hslInput;
}
get hasErrors() {
return this.errors;
}
get getErrorsList() {
return this.errmsg;
}
private addError(msg: string) {
this.errmsg.push(msg);
}
private setErrorState() {
this.errors = true;
}
private showErrors() {
this.errmsg.forEach((msg) => {
console.log(msg);
});
}
isHueOutOfRange() {
if (this.hslInput.h > HSL_LIMITS.MAX_H) {
this.addError(`Hue value is too high. Max is ${HSL_LIMITS.MAX_H}.`);
return true;
}
if (this.hslInput.h < HSL_LIMITS.MIN_H) {
this.addError(`Hue value is too low. Min is ${HSL_LIMITS.MIN_H}.`);
return true;
}
return false;
}
isSaturationOutOfRange() {
if (this.hslInput.s > HSL_LIMITS.MAX_S) {
this.addError(`Saturation value is too high. Max is ${HSL_LIMITS.MAX_S}.`);
return true;
}
if (this.hslInput.s < HSL_LIMITS.MIN_S) {
this.addError(`Saturation value is too low. Min is ${HSL_LIMITS.MIN_S}.`);
return true;
}
return false;
}
isLightnessOutOfRange() {
if (this.hslInput.l > HSL_LIMITS.MAX_L) {
this.addError(`Lightness value is too high. Max is ${HSL_LIMITS.MAX_L}.`);
return true;
}
if (this.hslInput.l < HSL_LIMITS.MIN_L) {
this.addError(`Lightness value is too low. Min is ${HSL_LIMITS.MIN_L}.`);
return true;
}
return false;
}
}