| 234 | } |
| 235 | |
| 236 | void Flag::SetValueFromString(const std::string& value) { |
| 237 | try { |
| 238 | switch (type_) { |
| 239 | case FlagType::BOOL: { |
| 240 | bool* val = static_cast<bool*>(value_); |
| 241 | if (value == "true" || value == "True" || value == "TRUE" || |
| 242 | value == "1") { |
| 243 | *val = true; |
| 244 | } else if (value == "false" || value == "False" || value == "FALSE" || |
| 245 | value == "0") { |
| 246 | *val = false; |
| 247 | } else { |
| 248 | throw std::invalid_argument( |
| 249 | ", please use [true, True, TRUE, 1] or [false, False, FALSE, " |
| 250 | "0]."); |
| 251 | } |
| 252 | break; |
| 253 | } |
| 254 | case FlagType::INT32: { |
| 255 | int32_t* val = static_cast<int32_t*>(value_); |
| 256 | *val = std::stoi(value); |
| 257 | break; |
| 258 | } |
| 259 | case FlagType::UINT32: { |
| 260 | uint32_t* val = static_cast<uint32_t*>(value_); |
| 261 | *val = std::stoul(value); |
| 262 | break; |
| 263 | } |
| 264 | case FlagType::INT64: { |
| 265 | int64_t* val = static_cast<int64_t*>(value_); |
| 266 | *val = std::stoll(value); |
| 267 | break; |
| 268 | } |
| 269 | case FlagType::UINT64: { |
| 270 | uint64_t* val = static_cast<uint64_t*>(value_); |
| 271 | *val = std::stoull(value); |
| 272 | break; |
| 273 | } |
| 274 | case FlagType::DOUBLE: { |
| 275 | double* val = static_cast<double*>(value_); |
| 276 | *val = std::stod(value); |
| 277 | break; |
| 278 | } |
| 279 | case FlagType::STRING: { |
| 280 | std::string* val = static_cast<std::string*>(value_); |
| 281 | *val = value; |
| 282 | break; |
| 283 | } |
| 284 | default: { |
| 285 | LOG_FLAG_FATAL_ERROR("flag type is undefined."); |
| 286 | } |
| 287 | } |
| 288 | } catch (const std::exception& e) { |
| 289 | std::string error_msg = "value: \"" + value + "\" is invalid for " + |
| 290 | FlagType2String(type_) + " flag \"" + name_ + "\""; |
| 291 | if (type_ == FlagType::BOOL) { |
| 292 | error_msg += e.what(); |
| 293 | } else { |
no test coverage detected