xdgcfg  0.3.0
xdgcfg.hpp
1 /* Public Domain / CC-0
2  * Author: tastytea <tastytea@tastytea.de>
3  */
4 
5 #ifndef XDGCFG_HPP
6 #define XDGCFG_HPP
7 
8 #if __cplusplus >= 201703L
9  #include <filesystem>
10 #else
11  #include <experimental/filesystem>
12 #endif
13 #include <string>
14 #include <iostream>
15 #include <cstdint>
16 #include <libconfig.h++>
17 #include <basedir.h>
18 
19 #if __cplusplus >= 201703L
20  namespace fs = std::filesystem;
21 #else
22  namespace fs = std::experimental::filesystem;
23 #endif
24 using std::string;
25 using std::uint_fast8_t;
26 using std::cerr;
27 using std::endl;
28 
29 class xdgcfg
30 {
31 public:
43  explicit xdgcfg(const string &filename, const string &subdir = "")
44  : _cfg()
45  , _verbose(false)
46  {
47  xdgHandle xdg;
48  xdgInitHandle(&xdg);
49  _filepath = xdgConfigHome(&xdg);
50  xdgWipeHandle(&xdg);
51 
52  if (!subdir.empty())
53  {
54  _filepath /= subdir;
55  }
56  if (!fs::exists(_filepath))
57  {
58  fs::create_directories(_filepath);
59  }
60  _filepath /= filename;
61  }
62 
68  uint_fast8_t read()
69  {
70  try
71  {
72  _cfg.readFile(_filepath.c_str());
73  }
74  catch (const libconfig::FileIOException &e)
75  {
76  if (_verbose)
77  {
78  cerr << "I/O error while reading " << _filepath
79  << " - " << e.what() << endl;
80  }
81  return 1;
82  }
83  catch (const libconfig::ParseException &e)
84  {
85  if (_verbose)
86  {
87  cerr << "Parse error at " << e.getFile() << ":" << e.getLine()
88  << " - " << e.getError() << endl;
89  }
90  return 2;
91  }
92 
93  return 0;
94  }
95 
101  bool write()
102  {
103  try
104  {
105  _cfg.writeFile(_filepath.c_str());
106  }
107  catch (const libconfig::FileIOException &e)
108  {
109  if (_verbose)
110  {
111  cerr << "I/O error while writing " << _filepath
112  << " - " << e.what() << endl;
113  }
114  return false;
115  }
116 
117  return true;
118  }
119 
128  libconfig::Config &get_cfg()
129  {
130  return _cfg;
131  }
132 
136  const fs::path get_filepath() const
137  {
138  return _filepath;
139  }
140 
144  void set_verbose(bool verbose)
145  {
146  _verbose = verbose;
147  }
148 
152  bool get_verbose() const
153  {
154  return _verbose;
155  }
156 
157 private:
161  libconfig::Config _cfg;
162 
166  fs::path _filepath;
167 
171  bool _verbose;
172 };
173 
178 #endif // XDGCFG_HPP
Definition: xdgcfg.hpp:29
libconfig::Config & get_cfg()
Returns a reference to the config as libconfig::Config.
Definition: xdgcfg.hpp:128
xdgcfg(const string &filename, const string &subdir="")
Checks if subdir is present, creates it if necessary.
Definition: xdgcfg.hpp:43
void set_verbose(bool verbose)
Sets verbosity.
Definition: xdgcfg.hpp:144
const fs::path get_filepath() const
Returns the complete filepath.
Definition: xdgcfg.hpp:136
uint_fast8_t read()
Read the file.
Definition: xdgcfg.hpp:68
bool get_verbose() const
Returns verbosity.
Definition: xdgcfg.hpp:152
bool write()
Write the file.
Definition: xdgcfg.hpp:101