Extract sium engine resolver

master
dev 5 months ago
parent 000178fdc4
commit 96b4a631a5

@ -36,6 +36,7 @@ Estado al cierre:
- `libs/cach/engine.ts` delega lectura `get()` en `runtime-get.ts`.
- `libs/cach/engine.ts` delega escritura `set()` en `runtime-set.ts`.
- `libs/cach/engine.ts` delega `query()` en `runtime-query.ts`; conserva composition root para context/io/delete/invalidate/mutate/explain.
- `arts/sium/engine-sium.ts` delega resolucion Lang/fallback e issues en `engine-resolver.ts`.
- `arts/conn/connection.ts` delega decode/routing de frames entrantes en `connection-message-router.ts`.
- `arts/conn/connection.ts` delega el intento open/auth/flush/join en `connection-connect.ts`.
- `arts/conn/connection.ts` delega current transport, attach/detach y close en `connection-transport-runtime.ts`.

@ -0,0 +1,61 @@
import type { EngineLang, LangParams, SupportedLocale } from '$lang';
import { ID_FALLBACK_SEPARATOR, parseLangRef } from '$lang';
import { SIUM_DIAGNOSTIC_EVENTS } from './consts';
import { emitSiumDiagnostic, type SiumDiagnostics } from './diagnostics';
import { resolve as resolveFallbackTemplate } from './langs';
import type { Issue } from './core';
export interface SiumResolver {
readonly resolve: (message: string, params?: LangParams, locale?: SupportedLocale) => string;
readonly resolveIssue: (issue: Issue, locale?: SupportedLocale) => string;
readonly resolveIssues: (issues: ReadonlyArray<Issue>, locale?: SupportedLocale) => string[];
}
interface SiumResolverOptions {
readonly lang?: EngineLang;
readonly defaultLocale: SupportedLocale;
readonly diagnostics: SiumDiagnostics;
}
function composeLangPath(message: string): string | undefined {
const parsed = parseLangRef(message);
if (parsed === null) return undefined;
if (parsed.fallback === undefined) return parsed.path;
return `${parsed.path}${ID_FALLBACK_SEPARATOR}${parsed.fallback}`;
}
function fallbackMessage(message: string, params?: LangParams): string {
const parsed = parseLangRef(message);
return resolveFallbackTemplate(parsed?.fallback ?? parsed?.path ?? message, params);
}
export function createSiumResolver(options: SiumResolverOptions): SiumResolver {
const { lang, defaultLocale, diagnostics } = options;
const resolve: SiumResolver['resolve'] = (message, params, locale = defaultLocale) => {
const langPath = composeLangPath(message);
if (lang === undefined || langPath === undefined) {
return fallbackMessage(message, params);
}
try {
return lang.t(langPath, params, locale);
} catch (error) {
emitSiumDiagnostic(diagnostics, SIUM_DIAGNOSTIC_EVENTS.RESOLVE_FALLBACK, {
message,
error
});
return fallbackMessage(message, params);
}
};
const resolveIssue: SiumResolver['resolveIssue'] = (entry, locale) => {
return resolve(entry.message, entry.params, locale);
};
const resolveIssues: SiumResolver['resolveIssues'] = (issues, locale) => {
return issues.map((entry) => resolveIssue(entry, locale));
};
return { resolve, resolveIssue, resolveIssues };
}

@ -1,8 +1,8 @@
import type { EngineLang, LangParams, SupportedLocale } from '$lang';
import { ID_FALLBACK_SEPARATOR, parseLangRef } from '$lang';
import type { Logger } from '$libs/logr';
import { SIUM_DIAGNOSTIC_EVENTS } from './consts';
import { createSiumDiagnostics, emitSiumDiagnostic, issueDiagnosticMeta } from './diagnostics';
import { createSiumResolver } from './engine-resolver';
import {
array,
boolean,
@ -59,7 +59,7 @@ import {
timeValue,
year
} from './types';
import { ISSUE_CODES, resolve as resolveFallbackTemplate, siumLangs } from './langs';
import { ISSUE_CODES, siumLangs } from './langs';
export interface EngineSiumOptions {
lang?: EngineLang;
@ -134,18 +134,6 @@ export interface EngineSium {
) => Result<O>;
}
function composeLangPath(message: string): string | undefined {
const parsed = parseLangRef(message);
if (parsed === null) return undefined;
if (parsed.fallback === undefined) return parsed.path;
return `${parsed.path}${ID_FALLBACK_SEPARATOR}${parsed.fallback}`;
}
function fallbackMessage(message: string, params?: LangParams): string {
const parsed = parseLangRef(message);
return resolveFallbackTemplate(parsed?.fallback ?? parsed?.path ?? message, params);
}
/**
* Public Sium facade.
*
@ -156,31 +144,7 @@ export function createEngineSium(options: EngineSiumOptions = {}): EngineSium {
const { lang, logger } = options;
const diagnostics = createSiumDiagnostics(logger);
const defaultLocale = options.locale ?? lang?.getDefaultLocale() ?? 'es';
const resolveMessage: EngineSium['resolve'] = (message, params, locale = defaultLocale) => {
const langPath = composeLangPath(message);
if (lang === undefined || langPath === undefined) {
return fallbackMessage(message, params);
}
try {
return lang.t(langPath, params, locale);
} catch (error) {
emitSiumDiagnostic(diagnostics, SIUM_DIAGNOSTIC_EVENTS.RESOLVE_FALLBACK, {
message,
error
});
return fallbackMessage(message, params);
}
};
const resolveIssue: EngineSium['resolveIssue'] = (entry, locale) => {
return resolveMessage(entry.message, entry.params, locale);
};
const resolveIssues: EngineSium['resolveIssues'] = (issues, locale) => {
return issues.map((entry) => resolveIssue(entry, locale));
};
const resolver = createSiumResolver({ lang, defaultLocale, diagnostics });
const validate: EngineSium['validate'] = async (schema, input, ctx) => {
const result = await schema.validate(input, ctx);
@ -258,9 +222,9 @@ export function createEngineSium(options: EngineSiumOptions = {}): EngineSium {
alpha,
issueCodes: ISSUE_CODES,
langSchema: siumLangs,
resolve: resolveMessage,
resolveIssue,
resolveIssues,
resolve: resolver.resolve,
resolveIssue: resolver.resolveIssue,
resolveIssues: resolver.resolveIssues,
validate,
validateSync
};

Loading…
Cancel
Save

Powered by TurnKey Linux.