import S, { DataSignal } from 's-js'; import { jsonable, Plain } from '../../utils/s'; import { unreachableCase } from '../../utils/typescript'; export type Contributor = YouTrackContributor | ExternalContributor; export interface ContributorBase { readonly type: ContributorKind; readonly hoursPerWeek: DataSignal; } export const enum ContributorKind { YOU_TRACK, EXTERNAL, } export interface ExternalContributor extends ContributorBase { readonly type: ContributorKind.EXTERNAL; readonly name: DataSignal; readonly numMembers: DataSignal; } export interface YouTrackContributor extends ContributorBase { readonly type: ContributorKind.YOU_TRACK; readonly id: string; } export function createContributor(plain: Plain): Contributor { switch (plain.type) { case ContributorKind.YOU_TRACK: return createYouTrackContributor(plain); case ContributorKind.EXTERNAL: return createExternalContributor(plain); default: return unreachableCase(plain); } } export function createExternalContributor(plain: Plain): ExternalContributor { return { ...createContributorBase(plain), type: ContributorKind.EXTERNAL, name: jsonable(S.value(plain.name)), numMembers: jsonable(S.value(plain.numMembers)), }; } export function createYouTrackContributor(plain: Plain): YouTrackContributor { return { ...createContributorBase(plain), type: ContributorKind.YOU_TRACK, id: plain.id, }; } function createContributorBase(plain: Plain): ContributorBase { return { type: plain.type, hoursPerWeek: jsonable(S.value(plain.hoursPerWeek)), }; }