about summary refs log tree commit diff
path: root/web/bubblegum/examples/hello.nix
{ depot, ... }:

let
  inherit (depot)
    lib
    ;

  inherit (depot.web.bubblegum)
    pathInfo
    respond
    absolutePath
    ;

  routes = {
    "/" = {
      status = "OK";
      title = "index";
      content = ''
        Hello World!
      '';
    };
    "/clock" = {
      status = "OK";
      title = "clock";
      content = ''
        It is ${toString builtins.currentTime}s since 1970-01-01 00:00 UTC.
      '';
    };
    "/coffee" = {
      status = "I'm a teapot";
      title = "coffee";
      content = ''
        No coffee, I'm afraid
      '';
    };
    "/type-error" = {
      status = 666;
      title = "bad usage";
      content = ''
        Never gonna see this.
      '';
    };
    "/eval-error" = {
      status = "OK";
      title = "evaluation error";
      content = builtins.throw "lol";
    };
  };

  notFound = {
    status = "Not Found";
    title = "404";
    content = ''
      This page doesn't exist.
    '';
  };

  navigation =
    lib.concatStrings (lib.mapAttrsToList
      (p: v: "<li><a href=\"${absolutePath p}\">${v.title}</a></li>")
      routes);

  template = { title, content, ... }: ''
    <!doctype html>
    <html lang="en">
    <head>
      <meta charset="utf-8">
      <title>${title}</title>
      <style>a:link, a:visited { color: blue; }</style>
    </head>
    <body>
      <hgroup>
      <h1><code>//web/bubblegum</code></h1>
      <h2>example app</h2>
      </hgroup>
      <header>
        <nav>
          <ul>${navigation}</ul>
        </nav>
      </header>
      <main>
        <p>${content}</p>
      </main>
    </body>
  '';

  response = routes."${pathInfo}" or notFound;

in
  respond response.status {
    "Content-type" = "text/html";
  } (template response)