peaclock

A colourful binary clock for the terminal.


peaclock

/

src

/

main.cc

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
#include "ob/parg.hh"
using Parg = OB::Parg;

#include "ob/term.hh"
namespace aec = OB::Term::ANSI_Escape_Codes;

#include "peaclock/tui.hh"

#include <cstddef>

#include <string>
#include <iostream>

// prototypes
int program_options(Parg& pg);

int program_options(Parg& pg)
{
  pg.name("peaclock").version("0.1.6 (15.01.2019)");
  pg.description("A colourful binary clock for the terminal.");
  pg.usage("[-v|--version]");
  pg.usage("[-h|--help]");
  pg.info("Key Bindings", {
    "q\n    quit the program",
    ":\n    enter the command prompt",
  });
  pg.info("Commands", {
    "q\n    quit the program",
    "reset\n    reset all settings",
    "set char <single_char>\n    set the binary clock character symbol",
    "set hour <12|24>\n    set 12 or 24 hour time",
    "set bold <on|off>\n    toggle bold style",
    "set compact <on|off>\n    toggle compact style",
    "set binary <on|off>\n    toggle binary clock",
    "set digital <on|off>\n    toggle digital clock",
    "set active <#000000-#ffffff|0-255|Colour>\n    set active colour to 24-bit, 8-bit, or 4-bit value",
    "set inactive <#000000-#ffffff|0-255|Colour>\n    set inactive colour to 24-bit, 8-bit, or 4-bit value",
  });
  pg.info("Colour", {
    "black",
    "red",
    "green",
    "yellow",
    "blue",
    "magenta",
    "cyan",
    "white",
  });
  pg.info("Examples", {
    "peaclock",
    "peaclock --help",
    "peaclock --version",
  });
  pg.info("Exit Codes", {"0 -> normal", "1 -> error"});
  pg.info("Repository", {
    "https://github.com/octobanana/peaclock.git",
  });
  pg.info("Homepage", {
    "https://octobanana.com/software/peaclock",
  });
  pg.author("Brett Robinson (octobanana) <octobanana.dev@gmail.com>");

  // general flags
  pg.set("help,h", "print the help output");
  pg.set("version,v", "print the program version");

  int status {pg.parse()};

  if (status < 0)
  {
    std::cerr << pg.help() << "\n";
    std::cerr << "Error: " << pg.error() << "\n";

    auto const similar_names = pg.similar();
    if (similar_names.size() > 0)
    {
      std::cerr
      << "did you mean:\n";
      for (auto const& e : similar_names)
      {
        std::cerr
        << "  --" << e << "\n";
      }
    }

    return -1;
  }

  if (pg.get<bool>("help"))
  {
    std::cerr << pg.help();

    return 1;
  }

  if (pg.get<bool>("version"))
  {
    std::cerr << pg.name() << " v" << pg.version() << "\n";

    return 1;
  }

  return 0;
}

int main(int argc, char *argv[])
{
  Parg pg {argc, argv};
  int pstatus {program_options(pg)};
  if (pstatus > 0) return 0;
  if (pstatus < 0) return 1;

  try
  {
    Tui tui;
    tui.run();
  }
  catch(std::exception const& e)
  {
    std::cerr << "Error: " << e.what() << "\n";
    return 1;
  }
  catch(...)
  {
    std::cerr << "Error: an unexpected error occurred\n";
    return 1;
  }

  return 0;
}
Back to Top