0.0.1Updated a month ago
import type { I_Menu } from "../../classes/entities/menu.ts";

export declare namespace SchemaReference {
  type Types = 'ledger' | 'supply' | 'audience' | 'menu';

  type Base<T extends Types> = {
    $ref: T;
    label: string;
    description?: string;
    required?: boolean;
    multiple?: boolean;
  }

  type Config = {
    [name: string]: { [R in Types]: Base<R> & { $ref: R } }[Types];
  };

  type IsOptional<F> =
    F extends { required: false } ? true : false;

  type IsMultiple<R> =
    R extends { multiple: true} ? true : false;

  // deno-lint-ignore no-explicit-any
  type ReturnType<R extends Base<any>> = Readonly<
      R['$ref'] extends 'ledger'
        ? { entries: { id: number, amount: number }[], name: "Some Test Ledger" }
      : R['$ref'] extends 'supply'
        ? { items: { id: number, value: number, name: string }[], name: "A Supply" }
      : R['$ref'] extends 'audience'
        ? { users: { name: string, surname: string }[] }
      : R['$ref'] extends 'menu'
        ? Omit<I_Menu, '__parent_class'>
      : undefined
    >;

  type MapLink<R extends Config> = {
    [K in keyof R]:
      IsMultiple<R[K]> extends true
        ? string[]
        : string
  }

  type Map<R extends Config> = {
    [K in keyof R]:
      IsMultiple<R[K]> extends true
        ? ReturnType<R[K]>[]
        : IsOptional<R[K]> extends true
          ? ReturnType<R[K]> | undefined
          : ReturnType<R[K]>
  }
}