import ms from "ms"; export abstract class TypeConverter { abstract fromString(value: string): T; abstract toString(value: T): string; abstract validate(value: string): boolean; } export abstract class StringTypeConverter extends TypeConverter { fromString(value: string): string { return value; } toString(value: string): string { return value; } validate(value: string): boolean { return typeof value === "string"; } } export abstract class NumberTypeConverter extends TypeConverter { fromString(value: string): number { return Number(value); } toString(value: number): string { return String(value); } validate(value: string): boolean { const num = Number(value); return !isNaN(num); } } export abstract class BooleanTypeConverter extends TypeConverter { fromString(value: string): boolean { return value === "true"; } toString(value: boolean): string { return value ? "true" : "false"; } validate(value: string): boolean { return value === "true" || value === "false"; } } export abstract class MsTypeConverter extends TypeConverter { fromString(value: string): ms.StringValue { return value as ms.StringValue; } toString(value: ms.StringValue): string { return String(value); } validate(value: string): boolean { try { const result = ms(value as ms.StringValue); return result !== undefined; } catch (e) { return false; } } } // Konkrete Implementierungen der Converter export class StringConverter extends StringTypeConverter {} export class LongStringConverter extends StringTypeConverter {} export class UrlConverter extends StringTypeConverter {} export class NumberConverter extends NumberTypeConverter {} export class BooleanConverter extends BooleanTypeConverter {} export class MsConverter extends MsTypeConverter {}