| 199 | } |
| 200 | |
| 201 | void Config::readFromFile(const std::string& file) { |
| 202 | fs::file_status status = fs::status(file); |
| 203 | fs::perms perm = status.permissions(); |
| 204 | |
| 205 | if (!fs::is_regular_file(status)) { |
| 206 | std::cerr << file << ": Not a file." << std::endl; |
| 207 | exit(-1); |
| 208 | } |
| 209 | |
| 210 | if ((perm & fs::perms::owner_read) == fs::perms::none) { |
| 211 | std::cerr << file << ": No access to read." << std::endl; |
| 212 | exit(-1); |
| 213 | } |
| 214 | |
| 215 | YAML::Node n = YAML::LoadFile(file); |
| 216 | |
| 217 | // Keys are always strings |
| 218 | bool given = false; |
| 219 | std::string CTL = "column_table_limit"; |
| 220 | std::string CL = "column_limit"; |
| 221 | for (const auto& kv : n) { |
| 222 | auto key = kv.first.as<std::string>(); |
| 223 | if (node[key]) { |
| 224 | switch (datatype[key]) { |
| 225 | case 'i': { |
| 226 | auto value = kv.second.as<int>(); |
| 227 | node[key] = std::any_cast<int>(validators[key](key, value)); |
| 228 | break; |
| 229 | } |
| 230 | case 'b': { |
| 231 | auto value = kv.second.as<bool>(); |
| 232 | node[key] = std::any_cast<bool>(validators[key](key, value)); |
| 233 | break; |
| 234 | } |
| 235 | case 'c': { |
| 236 | auto value = kv.second.as<char>(); |
| 237 | node[key] = std::any_cast<char>(validators[key](key, value)); |
| 238 | break; |
| 239 | } |
| 240 | case 's': { |
| 241 | auto value = kv.second.as<std::string>(); |
| 242 | node[key] = std::any_cast<std::string>(validators[key](key, value)); |
| 243 | break; |
| 244 | } |
| 245 | } |
| 246 | } |
| 247 | if (key == CTL) { |
| 248 | given = true; |
| 249 | } |
| 250 | } |
| 251 | if (!given) { |
| 252 | node[CTL] = node[CL]; |
| 253 | } |
| 254 | } |
| 255 | |
| 256 | void Config::readFromMap(std::map<std::string, std::any>& mp) { |
| 257 | bool given = false; |
no outgoing calls
no test coverage detected