import * as svt from "simple-validation-tools"; export type Recruiter = { type: "Recruiter"; Name: string; emails: (string | null | undefined)[]; recruiter: Recruiter | null | undefined; created: bigint; }; export function isRecruiter(value: unknown): value is Recruiter { return svt.isInterface(value, {type: "Recruiter", Name: svt.isString, emails: svt.arrayOf(svt.optional(svt.isString)), recruiter: svt.optional(isRecruiter), created: svt.isBigInt}); } export function validateRecruiter(value: unknown): svt.ValidationResult { return svt.validate(value, {type: "Recruiter", Name: svt.validateString, emails: svt.validateArray(svt.validateOptional(svt.validateString)), recruiter: svt.validateOptional(validateRecruiter), created: svt.validateBigInt}); } export type GetSearchesFilter = SearchesByQueryLike | SearchesByResultLike | NoSearchesFilter; export enum GetSearchesFilterTag { SearchesByQueryLike = "SearchesByQueryLike", SearchesByResultLike = "SearchesByResultLike", NoSearchesFilter = "NoSearchesFilter", } export type SearchesByQueryLike = { type: GetSearchesFilterTag.SearchesByQueryLike; data: string; }; export type SearchesByResultLike = { type: GetSearchesFilterTag.SearchesByResultLike; data: string; }; export type NoSearchesFilter = { type: GetSearchesFilterTag.NoSearchesFilter; }; export function SearchesByQueryLike(data: string): SearchesByQueryLike { return {type: GetSearchesFilterTag.SearchesByQueryLike, data}; } export function SearchesByResultLike(data: string): SearchesByResultLike { return {type: GetSearchesFilterTag.SearchesByResultLike, data}; } export function NoSearchesFilter(): NoSearchesFilter { return {type: GetSearchesFilterTag.NoSearchesFilter}; } export function isGetSearchesFilter(value: unknown): value is GetSearchesFilter { return [isSearchesByQueryLike, isSearchesByResultLike, isNoSearchesFilter].some((typePredicate) => typePredicate(value)); } export function isSearchesByQueryLike(value: unknown): value is SearchesByQueryLike { return svt.isInterface(value, {type: GetSearchesFilterTag.SearchesByQueryLike, data: svt.isString}); } export function isSearchesByResultLike(value: unknown): value is SearchesByResultLike { return svt.isInterface(value, {type: GetSearchesFilterTag.SearchesByResultLike, data: svt.isString}); } export function isNoSearchesFilter(value: unknown): value is NoSearchesFilter { return svt.isInterface(value, {type: GetSearchesFilterTag.NoSearchesFilter}); } export function validateGetSearchesFilter(value: unknown): svt.ValidationResult { return svt.validateWithTypeTag(value, {[GetSearchesFilterTag.SearchesByQueryLike]: validateSearchesByQueryLike, [GetSearchesFilterTag.SearchesByResultLike]: validateSearchesByResultLike, [GetSearchesFilterTag.NoSearchesFilter]: validateNoSearchesFilter}, "type"); } export function validateSearchesByQueryLike(value: unknown): svt.ValidationResult { return svt.validate(value, {type: GetSearchesFilterTag.SearchesByQueryLike, data: svt.validateString}); } export function validateSearchesByResultLike(value: unknown): svt.ValidationResult { return svt.validate(value, {type: GetSearchesFilterTag.SearchesByResultLike, data: svt.validateString}); } export function validateNoSearchesFilter(value: unknown): svt.ValidationResult { return svt.validate(value, {type: GetSearchesFilterTag.NoSearchesFilter}); } export type SearchesParameters = { filters: GetSearchesFilter[]; }; export function isSearchesParameters(value: unknown): value is SearchesParameters { return svt.isInterface(value, {filters: svt.arrayOf(isGetSearchesFilter)}); } export function validateSearchesParameters(value: unknown): svt.ValidationResult { return svt.validate(value, {filters: svt.validateArray(validateGetSearchesFilter)}); } export enum StillSize { w92 = "w92", w185 = "w185", w300 = "w300", h632 = "h632", original = "original", } export function isStillSize(value: unknown): value is StillSize { return [StillSize.w92, StillSize.w185, StillSize.w300, StillSize.h632, StillSize.original].some((v) => v === value); } export function validateStillSize(value: unknown): svt.ValidationResult { return svt.validateOneOfLiterals(value, [StillSize.w92, StillSize.w185, StillSize.w300, StillSize.h632, StillSize.original]); } export type LogInData = { username: string; password: string; }; export function isLogInData(value: unknown): value is LogInData { return svt.isInterface(value, {username: svt.isString, password: svt.isString}); } export function validateLogInData(value: unknown): svt.ValidationResult { return svt.validate(value, {username: svt.validateString, password: svt.validateString}); } export type UserId = { value: string; }; export function isUserId(value: unknown): value is UserId { return svt.isInterface(value, {value: svt.isString}); } export function validateUserId(value: unknown): svt.ValidationResult { return svt.validate(value, {value: svt.validateString}); } export type Channel = { name: string; private: boolean; }; export function isChannel(value: unknown): value is Channel { return svt.isInterface(value, {name: svt.isString, private: svt.isBoolean}); } export function validateChannel(value: unknown): svt.ValidationResult { return svt.validate(value, {name: svt.validateString, private: svt.validateBoolean}); } export type Email = { value: string; }; export function isEmail(value: unknown): value is Email { return svt.isInterface(value, {value: svt.isString}); } export function validateEmail(value: unknown): svt.ValidationResult { return svt.validate(value, {value: svt.validateString}); } export type Event = LogIn | LogOut | JoinChannels | SetEmails; export enum EventTag { LogIn = "LogIn", LogOut = "LogOut", JoinChannels = "JoinChannels", SetEmails = "SetEmails", } export type LogIn = { type: EventTag.LogIn; data: LogInData; }; export type LogOut = { type: EventTag.LogOut; data: UserId; }; export type JoinChannels = { type: EventTag.JoinChannels; data: Channel[]; }; export type SetEmails = { type: EventTag.SetEmails; data: Email[]; }; export function LogIn(data: LogInData): LogIn { return {type: EventTag.LogIn, data}; } export function LogOut(data: UserId): LogOut { return {type: EventTag.LogOut, data}; } export function JoinChannels(data: Channel[]): JoinChannels { return {type: EventTag.JoinChannels, data}; } export function SetEmails(data: Email[]): SetEmails { return {type: EventTag.SetEmails, data}; } export function isEvent(value: unknown): value is Event { return [isLogIn, isLogOut, isJoinChannels, isSetEmails].some((typePredicate) => typePredicate(value)); } export function isLogIn(value: unknown): value is LogIn { return svt.isInterface(value, {type: EventTag.LogIn, data: isLogInData}); } export function isLogOut(value: unknown): value is LogOut { return svt.isInterface(value, {type: EventTag.LogOut, data: isUserId}); } export function isJoinChannels(value: unknown): value is JoinChannels { return svt.isInterface(value, {type: EventTag.JoinChannels, data: svt.arrayOf(isChannel)}); } export function isSetEmails(value: unknown): value is SetEmails { return svt.isInterface(value, {type: EventTag.SetEmails, data: svt.arrayOf(isEmail)}); } export function validateEvent(value: unknown): svt.ValidationResult { return svt.validateWithTypeTag(value, {[EventTag.LogIn]: validateLogIn, [EventTag.LogOut]: validateLogOut, [EventTag.JoinChannels]: validateJoinChannels, [EventTag.SetEmails]: validateSetEmails}, "type"); } export function validateLogIn(value: unknown): svt.ValidationResult { return svt.validate(value, {type: EventTag.LogIn, data: validateLogInData}); } export function validateLogOut(value: unknown): svt.ValidationResult { return svt.validate(value, {type: EventTag.LogOut, data: validateUserId}); } export function validateJoinChannels(value: unknown): svt.ValidationResult { return svt.validate(value, {type: EventTag.JoinChannels, data: svt.validateArray(validateChannel)}); } export function validateSetEmails(value: unknown): svt.ValidationResult { return svt.validate(value, {type: EventTag.SetEmails, data: svt.validateArray(validateEmail)}); } export type Maybe = Nothing | Just; export enum MaybeTag { Nothing = "Nothing", Just = "Just", } export type Nothing = { type: MaybeTag.Nothing; }; export type Just = { type: MaybeTag.Just; data: T; }; export function Nothing(): Nothing { return {type: MaybeTag.Nothing}; } export function Just(data: T): Just { return {type: MaybeTag.Just, data}; } export function isMaybe(isT: svt.TypePredicate): svt.TypePredicate> { return function isMaybeT(value: unknown): value is Maybe { return [isNothing, isJust(isT)].some((typePredicate) => typePredicate(value)); }; } export function isNothing(value: unknown): value is Nothing { return svt.isInterface(value, {type: MaybeTag.Nothing}); } export function isJust(isT: svt.TypePredicate): svt.TypePredicate> { return function isJustT(value: unknown): value is Just { return svt.isInterface>(value, {type: MaybeTag.Just, data: isT}); }; } export function validateMaybe(validateT: svt.Validator): svt.Validator> { return function validateMaybeT(value: unknown): svt.ValidationResult> { return svt.validateWithTypeTag>(value, {[MaybeTag.Nothing]: validateNothing, [MaybeTag.Just]: validateJust(validateT)}, "type"); }; } export function validateNothing(value: unknown): svt.ValidationResult { return svt.validate(value, {type: MaybeTag.Nothing}); } export function validateJust(validateT: svt.Validator): svt.Validator> { return function validateJustT(value: unknown): svt.ValidationResult> { return svt.validate>(value, {type: MaybeTag.Just, data: validateT}); }; } export type Either = Left | Right; export enum EitherTag { Left = "Left", Right = "Right", } export type Left = { type: EitherTag.Left; data: L; }; export type Right = { type: EitherTag.Right; data: R; }; export function Left(data: L): Left { return {type: EitherTag.Left, data}; } export function Right(data: R): Right { return {type: EitherTag.Right, data}; } export function isEither(isL: svt.TypePredicate, isR: svt.TypePredicate): svt.TypePredicate> { return function isEitherLR(value: unknown): value is Either { return [isLeft(isL), isRight(isR)].some((typePredicate) => typePredicate(value)); }; } export function isLeft(isL: svt.TypePredicate): svt.TypePredicate> { return function isLeftL(value: unknown): value is Left { return svt.isInterface>(value, {type: EitherTag.Left, data: isL}); }; } export function isRight(isR: svt.TypePredicate): svt.TypePredicate> { return function isRightR(value: unknown): value is Right { return svt.isInterface>(value, {type: EitherTag.Right, data: isR}); }; } export function validateEither(validateL: svt.Validator, validateR: svt.Validator): svt.Validator> { return function validateEitherLR(value: unknown): svt.ValidationResult> { return svt.validateWithTypeTag>(value, {[EitherTag.Left]: validateLeft(validateL), [EitherTag.Right]: validateRight(validateR)}, "type"); }; } export function validateLeft(validateL: svt.Validator): svt.Validator> { return function validateLeftL(value: unknown): svt.ValidationResult> { return svt.validate>(value, {type: EitherTag.Left, data: validateL}); }; } export function validateRight(validateR: svt.Validator): svt.Validator> { return function validateRightR(value: unknown): svt.ValidationResult> { return svt.validate>(value, {type: EitherTag.Right, data: validateR}); }; } export type Person = { name: string; age: number; efficiency: number; on_vacation: boolean; hobbies: string[]; last_fifteen_comments: string[]; recruiter: Recruiter; spouse: Maybe; }; export function isPerson(value: unknown): value is Person { return svt.isInterface(value, {name: svt.isString, age: svt.isNumber, efficiency: svt.isNumber, on_vacation: svt.isBoolean, hobbies: svt.arrayOf(svt.isString), last_fifteen_comments: svt.arrayOf(svt.isString), recruiter: isRecruiter, spouse: isMaybe(isPerson)}); } export function validatePerson(value: unknown): svt.ValidationResult { return svt.validate(value, {name: svt.validateString, age: svt.validateNumber, efficiency: svt.validateNumber, on_vacation: svt.validateBoolean, hobbies: svt.validateArray(svt.validateString), last_fifteen_comments: svt.validateArray(svt.validateString), recruiter: validateRecruiter, spouse: validateMaybe(validatePerson)}); } export type EmbeddedEvent = EmbeddedLogIn | SystemImploded; export enum EmbeddedEventTag { EmbeddedLogIn = "EmbeddedLogIn", SystemImploded = "SystemImploded", } export type EmbeddedLogIn = { type: EmbeddedEventTag.EmbeddedLogIn; username: string; password: string; }; export type SystemImploded = { type: EmbeddedEventTag.SystemImploded; }; export function EmbeddedLogIn(data: LogInData): EmbeddedLogIn { return {type: EmbeddedEventTag.EmbeddedLogIn, ...data}; } export function SystemImploded(): SystemImploded { return {type: EmbeddedEventTag.SystemImploded}; } export function isEmbeddedEvent(value: unknown): value is EmbeddedEvent { return [isEmbeddedLogIn, isSystemImploded].some((typePredicate) => typePredicate(value)); } export function isEmbeddedLogIn(value: unknown): value is EmbeddedLogIn { return svt.isInterface(value, {type: EmbeddedEventTag.EmbeddedLogIn, username: svt.isString, password: svt.isString}); } export function isSystemImploded(value: unknown): value is SystemImploded { return svt.isInterface(value, {type: EmbeddedEventTag.SystemImploded}); } export function validateEmbeddedEvent(value: unknown): svt.ValidationResult { return svt.validateWithTypeTag(value, {[EmbeddedEventTag.EmbeddedLogIn]: validateEmbeddedLogIn, [EmbeddedEventTag.SystemImploded]: validateSystemImploded}, "type"); } export function validateEmbeddedLogIn(value: unknown): svt.ValidationResult { return svt.validate(value, {type: EmbeddedEventTag.EmbeddedLogIn, username: svt.validateString, password: svt.validateString}); } export function validateSystemImploded(value: unknown): svt.ValidationResult { return svt.validate(value, {type: EmbeddedEventTag.SystemImploded}); }