#rustify: Result type en Typescript

1 messages · Page 1 of 1 (latest)

west schooner
#

Hola devs,
Hice esta lib rustify para manejar errores en TypeScript como en Rust (con Result, Ok y Err). Menos try/catch y más claro.
Incluye una función especial:

// envolver algo que puede fallar:
const safeParse = wrapInResult(JSON.parse);

// Si funciona:
const ok = safeParse('{"data": 1}'); // Ok({ data: 1 })
console.log(ok.unwrapOr({})); // -> { data: 1 }

// Si falla:
const err = safeParse('{malo'); // Err(...)
if (err.isErr()) console.error("Falló!", err.err());

Ahí les dejo el link por si quieren probar:
https://github.com/ghaerdi/rustify

No es rust pero está inspirado. Espero que le sirva a alguien.

GitHub

Rustify your Typescript. Contribute to ghaerdi/rustify development by creating an account on GitHub.

signal dock
#

@sapphire/result

#

mira ese package te podría interesar

west schooner
fair karma
#

@rotund crown mira

rotund crown
west schooner
#

ya tengo unas cuantas ideas para extender la api gracias a las sugerencias de algunas personas

west schooner
#

Para los interesados acabo de lanzar nueva versión v1.1.0 🎉

Esta versión trae nuevos métodos útiles para Result:
Result.from: Envuelve fácilmente funciones que pueden lanzar errores.
Result.fromAsync: Lo mismo, pero para funciones asíncronas
Result.isResult: Un type guard para verificar si algo es un Ok o Err.
result.match: Para manejar explícitamente los casos Ok y Err.

⚠️ Deprecación: wrapInResult está obsoleto. Usen Result.from(() => fn(...args)) en su lugar.

Chequeen este ejemplo usando Result.from y match:

import { Result } from "@ghaerdi/rustify";

const divide = (a: number, b: number): number => {
  if (b === 0) throw "cannot divide by 0";
  return a / b;
}

// ¡Captura el error sin try/catch!
const result = Result.from(() => divide(10, 0)).match({
  Ok: (value) => value, // No se ejecutará aquí
  Err: (err) => {
    console.error(err) // Log: "cannot divide by 0"
    return NaN;        // Valor por defecto en caso de error
  }
})

console.log(result); // NaN

Qué les parece?

west schooner
#

Bueno, ahí añadí un par de metodos más

import { Ok, Err } from "@ghaerdi/rustify";

const okResult = Ok(100);
const errResult = Err("¡Ups!");

// Usando asTuple()
const [err1, val1] = okResult.asTuple(); // err1 = undefined, val1 = 100
const [err2, val2] = errResult.asTuple(); // err2 = "¡Ups!", val2 = undefined
console.log(`Tuple -> Valor: ${val1}, Error: ${err2}`);

// Usando asObject()
const { error: err3, value: val3 } = okResult.asObject(); // err3 = undefined, val3 = 100
const { error: err4, value: val4 } = errResult.asObject(); // err4 = "¡Ups!", val4 = undefined
console.log(`Object -> Valor: ${val3}, Error: ${err4}`);

🔗 https://github.com/ghaerdi/rustify

#

Si tienen alguna duda o sugerencia. Me dejan saber

fair karma
#

Insano

west schooner
#

Intenté implementar la mayoría de los métodos que tiene Result para Rust, más algunas utilidades. Hay algunos que falta porque no le veo mucho sentido tenerlos en javascript por como se diferencian en manejo de memoria, referencias y mutabilidad.

#

Pero si creen que me falta alguno o quieren surgerir alguna utilidad pues me dejan saber

west schooner
#

Denle estrellita

daring egret
#

No sé si te inspiraste en esto

west schooner
#

Igual agradezco que me pasen repos similares

white island