Skip to content

sidiousvic/dontpanic

Repository files navigation

🚯 dontpanic

npm package Build Status Code Coverage Commitizen Friendly Semantic Release

Introduction

Humans are known to panic. This is widely considered bad design.

function eat(f: string) {
  if (f === '🌯') ...
  else throw; // panic
}

Panic is not useful™. What's useful is a thorough assessment of the circumstances. dontpanic brings you blazingly steadfast abstractions that help you recover from failure and guide your code to success.

DontPanic(eat)('🌯').onSuccess(sleep).onFailure(getPizza); // 🍕 Don't panic

Principles

🚯 No littering

Unhandled throws crash your program and send it into an unrecoverable state.

throw new Error('Invalid input'); // 🚯 Crash risk

return Failed('Invalid input'); // 🛣  No crash risk

99.9% of the time there is no need to panic.

⚠️ Explicit content

Throwable functions do not encode potential in their type signature.

const parsed = JSON.stringify(input); // ⚠️ Number, may crash

DontPanic(JSON.stringify)(input); // ✅  Outcome<string, Error>

Explicit is better than implicit.

🥞 Flat as a pancake

Try/catch creates new execution scopes.

try {
  const parsed = JSON.parse(input);
  try {
    const validated = validateInput(parsed);
    register(validated);
  } catch (e) {
    handleValidationError(e);
  }
} catch (e) {
  handleParsingError(e); // 🪹 Far away from home
}

DontPanic(JSON.parse)(input) // 🥞
  .onFailure(handleParsingError)
  .onSuccess(validateInput)
  .onFailure(handleValidationError)
  .onSuccess(register);

Flatten your error handling.

Install

npm install @sidiousware/dontpanic