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 lectura `get()` en `runtime-get.ts`.
- `libs/cach/engine.ts` delega escritura `set()` en `runtime-set.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. - `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 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 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`. - `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 type { EngineLang, LangParams, SupportedLocale } from '$lang';
import { ID_FALLBACK_SEPARATOR, parseLangRef } from '$lang';
import type { Logger } from '$libs/logr'; import type { Logger } from '$libs/logr';
import { SIUM_DIAGNOSTIC_EVENTS } from './consts'; import { SIUM_DIAGNOSTIC_EVENTS } from './consts';
import { createSiumDiagnostics, emitSiumDiagnostic, issueDiagnosticMeta } from './diagnostics'; import { createSiumDiagnostics, emitSiumDiagnostic, issueDiagnosticMeta } from './diagnostics';
import { createSiumResolver } from './engine-resolver';
import { import {
array, array,
boolean, boolean,
@ -59,7 +59,7 @@ import {
timeValue, timeValue,
year year
} from './types'; } from './types';
import { ISSUE_CODES, resolve as resolveFallbackTemplate, siumLangs } from './langs'; import { ISSUE_CODES, siumLangs } from './langs';
export interface EngineSiumOptions { export interface EngineSiumOptions {
lang?: EngineLang; lang?: EngineLang;
@ -134,18 +134,6 @@ export interface EngineSium {
) => Result<O>; ) => 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. * Public Sium facade.
* *
@ -156,31 +144,7 @@ export function createEngineSium(options: EngineSiumOptions = {}): EngineSium {
const { lang, logger } = options; const { lang, logger } = options;
const diagnostics = createSiumDiagnostics(logger); const diagnostics = createSiumDiagnostics(logger);
const defaultLocale = options.locale ?? lang?.getDefaultLocale() ?? 'es'; const defaultLocale = options.locale ?? lang?.getDefaultLocale() ?? 'es';
const resolver = createSiumResolver({ lang, defaultLocale, diagnostics });
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 validate: EngineSium['validate'] = async (schema, input, ctx) => { const validate: EngineSium['validate'] = async (schema, input, ctx) => {
const result = await schema.validate(input, ctx); const result = await schema.validate(input, ctx);
@ -258,9 +222,9 @@ export function createEngineSium(options: EngineSiumOptions = {}): EngineSium {
alpha, alpha,
issueCodes: ISSUE_CODES, issueCodes: ISSUE_CODES,
langSchema: siumLangs, langSchema: siumLangs,
resolve: resolveMessage, resolve: resolver.resolve,
resolveIssue, resolveIssue: resolver.resolveIssue,
resolveIssues, resolveIssues: resolver.resolveIssues,
validate, validate,
validateSync validateSync
}; };

Loading…
Cancel
Save

Powered by TurnKey Linux.