JayBeams  0.1
Another project to have fun coding.
severity_level.cpp
Go to the documentation of this file.
1 #include "jb/severity_level.hpp"
2 
3 #include <algorithm>
4 #include <cstring>
5 #include <sstream>
6 #include <stdexcept>
7 
8 namespace {
9 /// The names for the security levels
10 char const* const severity_level_names[] = {"TRACE", "DEBUG", "INFO",
11  "NOTICE", "WARNING", "ERROR",
12  "CRITICAL", "ALERT", "FATAL"};
13 
14 /// Compute the width for the security level field.
15 int max_severity_level_width() {
16  std::size_t r = 0;
17  for (char const* name : severity_level_names) {
18  r = std::max(r, std::strlen(name));
19  }
20  return r;
21 }
22 
23 /// Store the width in a constant
24 int const sev_level_width = max_severity_level_width();
25 } // anonymous namespace
26 
27 std::ostream& jb::operator<<(std::ostream& os, severity_level const& x) {
28  std::size_t const count =
29  sizeof(severity_level_names) / sizeof(severity_level_names[0]);
30  int idx = static_cast<int>(x);
31  if (idx < 0 or std::size_t(idx) >= count) {
32  return os << "[invalid severity (" << idx << ")]";
33  }
34  return os << severity_level_names[idx];
35 }
36 
37 std::istream& jb::operator>>(std::istream& is, severity_level& x) {
38  std::string name;
39  is >> name;
40  parse(x, name);
41  return is;
42 }
43 
44 void jb::parse(severity_level& lhs, std::string const& rhs) {
45  std::size_t const count =
46  sizeof(severity_level_names) / sizeof(severity_level_names[0]);
47  for (std::size_t i = 0; i != count; ++i) {
48  if (rhs == severity_level_names[i]) {
49  lhs = static_cast<jb::severity_level>(i);
50  return;
51  }
52  }
53  std::ostringstream os;
54  os << "Unknown or invalid severity level (" << rhs << ")";
55  throw std::invalid_argument(os.str());
56 }
57 
58 char const* jb::get_name(severity_level const& rhs) {
59  std::size_t const count =
60  sizeof(severity_level_names) / sizeof(severity_level_names[0]);
61  if (0 <= static_cast<int>(rhs) and static_cast<std::size_t>(rhs) < count) {
62  return severity_level_names[static_cast<int>(rhs)];
63  }
64  std::ostringstream os;
65  os << "Unknown or invalid severity level (" << rhs << ")";
66  throw std::invalid_argument(os.str());
67 }
68 
70  return sev_level_width;
71 }
severity_level
Severity levels for JayBeams, based on syslog.
std::ostream & operator<<(std::ostream &os, as_hhmmssu const &x)
Format as_hhmmssu into an iostream.
Definition: as_hhmmss.cpp:8
char const * get_name(severity_level const &rhs)
Get the name of a security level.
std::istream & operator>>(std::istream &, cpu_set &)
Read a cpu set in list format.
Definition: cpu_set.cpp:104
int severity_level_width()
Return the recommended with for printing security levels.
void parse(severity_level &lhs, std::string const &rhs)
Parse a severity level.