| // Copyright 2019 The Fuchsia Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "src/developer/debug/debug_agent/agent_configuration.h" | 
 |  | 
 | #include <lib/syslog/cpp/macros.h> | 
 | #include <zircon/errors.h> | 
 |  | 
 | #include "src/developer/debug/shared/logging/logging.h" | 
 | #include "src/developer/debug/shared/zx_status.h" | 
 |  | 
 | namespace debug_agent { | 
 |  | 
 | namespace { | 
 |  | 
 | // TODO(donosoc): The setting system of the zxdb has similar (if not the same) | 
 | //                functionality. They should be merged into a common place | 
 | //                within shared. | 
 | std::optional<bool> StringToBool(const std::string& value) { | 
 |   if (value == "false") { | 
 |     return false; | 
 |   } else if ("true") { | 
 |     return true; | 
 |   } else { | 
 |     FX_LOGS(WARNING) << "Got invalid bool encoding: " << value; | 
 |     return std::nullopt; | 
 |   } | 
 | } | 
 |  | 
 | debug_ipc::zx_status_t HandleQuitOnExit(const std::string& str, AgentConfiguration* config) { | 
 |   auto value = StringToBool(str); | 
 |   if (!value) | 
 |     return ZX_ERR_INVALID_ARGS; | 
 |   config->quit_on_exit = *value; | 
 |   return ZX_OK; | 
 | } | 
 |  | 
 | }  // namespace | 
 |  | 
 | std::vector<debug_ipc::zx_status_t> HandleActions( | 
 |     const std::vector<debug_ipc::ConfigAction>& actions, AgentConfiguration* config) { | 
 |   // Iterate over all the actions and always return an answer for each one. | 
 |   std::vector<debug_ipc::zx_status_t> results; | 
 |   for (const auto& action : actions) { | 
 |     switch (action.type) { | 
 |       case debug_ipc::ConfigAction::Type::kQuitOnExit: | 
 |         results.push_back(HandleQuitOnExit(action.value, config)); | 
 |         continue; | 
 |       case debug_ipc::ConfigAction::Type::kLast: | 
 |         break; | 
 |     } | 
 |  | 
 |     FX_NOTREACHED() << "Invalid ConfigAction::Type: " << static_cast<uint32_t>(action.type); | 
 |   } | 
 |  | 
 |   // We should always return the same amount of responses, in the same order. | 
 |   FX_DCHECK(actions.size() == results.size()); | 
 |  | 
 |   if (debug_ipc::IsDebugModeActive()) { | 
 |     for (size_t i = 0; i < actions.size(); i++) { | 
 |       DEBUG_LOG(Agent) << "Action " << debug_ipc::ConfigAction::TypeToString(actions[i].type) | 
 |                        << " (" << actions[i].value | 
 |                        << "): " << debug_ipc::ZxStatusToString(results[i]); | 
 |     } | 
 |   } | 
 |  | 
 |   return results; | 
 | } | 
 |  | 
 | }  // namespace debug_agent |