summaryrefslogtreecommitdiff
path: root/src/config/config.hpp
blob: 9c28e8c46955425860a92b520da34f607b757d72 (plain)
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
/**
 * Read the config file and save all the values in a map.
 * Also, a singleton.
 *
 * Use Config::filename = "bla" to set the filename you want to use.
 *
 * If you want to exit if the file does not exist when it is open for
 * reading, set Config::file_must_exist = true.
 *
 * Config::get() can then be used to access the values in the conf.
 *
 * Use Config::close() when you're done getting/setting value. This will
 * save the config into the file.
 */

#pragma once

#include <functional>
#include <fstream>
#include <memory>
#include <vector>
#include <string>
#include <map>

typedef std::function<void()> t_config_changed_callback;

class Config
{
public:
  Config() = default;
  ~Config() = default;
  Config(const Config&) = delete;
  Config& operator=(const Config&) = delete;
  Config(Config&&) = delete;
  Config& operator=(Config&&) = delete;

  /**
   * returns a value from the config. If it doesn’t exist, use
   * the second argument as the default.
   */
  static std::string get(const std::string&, const std::string&);
  /**
   * returns a value from the config. If it doesn’t exist, use
   * the second argument as the default.
   */
  static int get_int(const std::string&, const int&);
  static bool get_bool(const std::string&, const bool);
  /**
   * Returns true if value is present in a colon-separated list, otherwise
   * false.
   */
  static bool is_in_list(const std::string& option, const std::string& value);
  /**
   * Set a value for the given option. And write all the config
   * in the file from which it was read if save is true.
   */
  static void set(const std::string&, const std::string&, bool save = false);
  /**
   * Adds a function to a list. This function will be called whenever a
   * configuration change occurs (when set() is called, or when the initial
   * conf is read)
   */
  static void connect(const t_config_changed_callback&);
  /**
   * Destroy the instance, forcing it to be recreated (with potentially
   * different parameters) the next time it’s needed.
   */
  static void clear();
  /**
   * Read the configuration file at the given path.
   */
  static bool read_conf(const std::string& name="");
  /**
   * Get the filename
   */
  static const std::string& get_filename()
  { return Config::filename; }

private:
  /**
   * Set the value of the filename to use, before calling any method.
   */
  static std::string filename;
  /**
   * Write all the config values into the configuration file
   */
  static void save_to_file();
  /**
   * Call all the callbacks previously registered using connect().
   * This is used to notify any class that a configuration change occured.
   */
  static void trigger_configuration_change();

  static std::map<std::string, std::string> values;
  static std::vector<t_config_changed_callback> callbacks;

};