Files
core2026/packages/logic/src/constraints/misc.ts
T

62 lines
2.0 KiB
TypeScript

import { allow, compareValues, type CompareOperator } from './helpers.js';
import type { Constraint } from './types.js';
export const denyWithReason = (reason: string): Constraint => ({
name: 'denyWithReason',
requires: () => [],
test: () => ({ kind: 'deny', reason }),
});
export const notOpeningPart = (relYear: number, openingPartYear: number): Constraint => ({
name: 'notOpeningPart',
requires: () => [],
test: (_ctx) => {
if (relYear >= openingPartYear) {
return allow();
}
return { kind: 'deny', reason: '초반 제한 중에는 불가능합니다.' };
},
});
export const beOpeningPart = (): Constraint => ({
name: 'beOpeningPart',
requires: () => [
{ kind: 'env', key: 'relYear' },
{ kind: 'env', key: 'openingPartYear' },
],
test: (_ctx, view) => {
const relYear = view.get({ kind: 'env', key: 'relYear' }) as number | undefined;
const openingPartYear = view.get({ kind: 'env', key: 'openingPartYear' }) as number | undefined;
if (openingPartYear === undefined) {
return { kind: 'deny', reason: '초반 제한 중에는 불가능합니다.' };
}
if (relYear === undefined) {
return { kind: 'deny', reason: '초반 제한 중에는 불가능합니다.' };
}
if (relYear + 1 < openingPartYear) {
return allow();
}
return { kind: 'deny', reason: '초반 제한 중에는 불가능합니다.' };
},
});
export const reqEnvValue = (key: string, comp: CompareOperator, reqVal: unknown, failMessage: string): Constraint => ({
name: 'reqEnvValue',
requires: () => [{ kind: 'env', key }],
test: (_ctx, view) => {
const req = { kind: 'env', key } as const;
if (!view.has(req)) {
return { kind: 'deny', reason: failMessage };
}
const envValue = view.get(req);
if (compareValues(envValue, comp, reqVal)) {
return allow();
}
return { kind: 'deny', reason: failMessage };
},
});