Revert "Revert "Remove boolean setter callbacks for Cuttlefish flag library""

This reverts commit 722663e513d06d32803246babf04594279fdee8d.

Bug: 285955928
Test: stop_cvd --helpxml
Change-Id: I03c7f96ffd904cbedc39b54f99f1f6077e6eb83c
diff --git a/common/libs/utils/flag_parser.cpp b/common/libs/utils/flag_parser.cpp
index 2a62dd8..4e821d7 100644
--- a/common/libs/utils/flag_parser.cpp
+++ b/common/libs/utils/flag_parser.cpp
@@ -123,27 +123,6 @@
   return *this;
 }
 
-Flag& Flag::Setter(std::function<bool(const FlagMatch&)> fn) & {
-  setter_ = [fn = std::move(fn)](const FlagMatch& match) -> Result<void> {
-    if (fn(match)) {
-      return {};
-    } else {
-      return CF_ERR("Flag setter failed");
-    }
-  };
-  return *this;
-}
-Flag Flag::Setter(std::function<bool(const FlagMatch&)> fn) && {
-  setter_ = [fn = std::move(fn)](const FlagMatch& match) -> Result<void> {
-    if (fn(match)) {
-      return {};
-    } else {
-      return CF_ERR("Flag setter failed");
-    }
-  };
-  return *this;
-}
-
 Flag& Flag::Setter(std::function<Result<void>(const FlagMatch&)> setter) & {
   setter_ = std::move(setter);
   return *this;
@@ -440,14 +419,14 @@
 }
 
 Flag HelpFlag(const std::vector<Flag>& flags, std::string text) {
-  auto setter = [&flags, text](FlagMatch) {
+  auto setter = [&flags, text](FlagMatch) -> Result<void> {
     if (text.size() > 0) {
       LOG(INFO) << text;
     }
     for (const auto& flag : flags) {
       LOG(INFO) << flag;
     }
-    return false;
+    return CF_ERR("user requested early exit");
   };
   return Flag()
       .Alias({FlagAliasMode::kFlagExact, "-help"})
@@ -518,9 +497,8 @@
       .Help(
           "This executable only supports the flags in `-help`. Positional "
           "arguments may be supported.")
-      .Setter([](const FlagMatch& match) {
-        LOG(ERROR) << "Unknown flag " << match.value;
-        return false;
+      .Setter([](const FlagMatch& match) -> Result<void> {
+        return CF_ERRF("Unknown flag \"{}\"", match.value);
       });
 }
 
@@ -530,9 +508,8 @@
       .Help(
           "This executable only supports the flags in `-help`. Positional "
           "arguments are not supported.")
-      .Setter([](const FlagMatch& match) {
-        LOG(ERROR) << "Unexpected argument \"" << match.value << "\"";
-        return false;
+      .Setter([](const FlagMatch& match) -> Result<void> {
+        return CF_ERRF("Unexpected argument \"{}\"", match.value);
       });
 }
 
@@ -547,9 +524,9 @@
 Flag GflagsCompatFlag(const std::string& name, std::string& value) {
   return GflagsCompatFlag(name)
       .Getter([&value]() { return value; })
-      .Setter([&value](const FlagMatch& match) {
+      .Setter([&value](const FlagMatch& match) -> Result<void> {
         value = match.value;
-        return true;
+        return {};
       });
 }
 
diff --git a/common/libs/utils/flag_parser.h b/common/libs/utils/flag_parser.h
index efc8c7d..3304311 100644
--- a/common/libs/utils/flag_parser.h
+++ b/common/libs/utils/flag_parser.h
@@ -81,9 +81,8 @@
   /* Set a loader that displays the current value in help text. Optional. */
   Flag& Getter(std::function<std::string()>) &;
   Flag Getter(std::function<std::string()>) &&;
-  /* Set the callback for matches. The callback be invoked multiple times. */
-  Flag& Setter(std::function<bool(const FlagMatch&)>) &;
-  Flag Setter(std::function<bool(const FlagMatch&)>) &&;
+  /* Set the callback for matches. The callback may be invoked multiple times.
+   */
   Flag& Setter(std::function<Result<void>(const FlagMatch&)>) &;
   Flag Setter(std::function<Result<void>(const FlagMatch&)>) &&;
 
diff --git a/common/libs/utils/flag_parser_test.cpp b/common/libs/utils/flag_parser_test.cpp
index 74422e5..0da8471 100644
--- a/common/libs/utils/flag_parser_test.cpp
+++ b/common/libs/utils/flag_parser_test.cpp
@@ -117,9 +117,9 @@
 TEST(FlagParser, RepeatedListFlag) {
   std::vector<std::string> elems;
   auto flag = GflagsCompatFlag("myflag");
-  flag.Setter([&elems](const FlagMatch& match) {
+  flag.Setter([&elems](const FlagMatch& match) -> Result<void> {
     elems.push_back(match.value);
-    return true;
+    return {};
   });
   ASSERT_THAT(flag.Parse({"-myflag=a", "--myflag", "b"}), IsOk());
   ASSERT_EQ(elems, (std::vector<std::string>{"a", "b"}));
@@ -391,9 +391,9 @@
     elems_.clear();
     flag_ = Flag()
                 .Alias({FlagAliasMode::kFlagConsumesArbitrary, "--flag"})
-                .Setter([this](const FlagMatch& match) {
+                .Setter([this](const FlagMatch& match) -> Result<void> {
                   elems_.push_back(match.value);
-                  return true;
+                  return {};
                 });
   }
   Flag flag_;
diff --git a/common/libs/utils/shared_fd_flag.cpp b/common/libs/utils/shared_fd_flag.cpp
index b894147..e50d6d1 100644
--- a/common/libs/utils/shared_fd_flag.cpp
+++ b/common/libs/utils/shared_fd_flag.cpp
@@ -31,18 +31,16 @@
 
 namespace cuttlefish {
 
-static bool Set(const FlagMatch& match, SharedFD& out) {
+static Result<void> Set(const FlagMatch& match, SharedFD& out) {
   int raw_fd;
-  if (!android::base::ParseInt(match.value.c_str(), &raw_fd)) {
-    LOG(ERROR) << "Failed to parse value \"" << match.value
-               << "\" for fd flag \"" << match.key << "\"";
-    return false;
-  }
+  CF_EXPECTF(android::base::ParseInt(match.value.c_str(), &raw_fd),
+             "Failed to parse value \"{}\" for fd flag \"{}\"", match.value,
+             match.key);
   out = SharedFD::Dup(raw_fd);
   if (out->IsOpen()) {
     close(raw_fd);
   }
-  return true;
+  return {};
 }
 
 Flag SharedFDFlag(SharedFD& out) {
diff --git a/host/commands/cvd/acloud/converter.cpp b/host/commands/cvd/acloud/converter.cpp
index 6c90b6e..b3638d5 100644
--- a/host/commands/cvd/acloud/converter.cpp
+++ b/host/commands/cvd/acloud/converter.cpp
@@ -182,36 +182,36 @@
       Flag()
           .Alias({FlagAliasMode::kFlagConsumesFollowing, "--boot-build-id"})
           .Alias({FlagAliasMode::kFlagConsumesFollowing, "--boot_build_id"})
-          .Setter([&boot_build_id](const FlagMatch& m) {
+          .Setter([&boot_build_id](const FlagMatch& m) -> Result<void> {
             boot_build_id = m.value;
-            return true;
+            return {};
           }));
   std::optional<std::string> boot_build_target;
   flags.emplace_back(
       Flag()
           .Alias({FlagAliasMode::kFlagConsumesFollowing, "--boot-build-target"})
           .Alias({FlagAliasMode::kFlagConsumesFollowing, "--boot_build_target"})
-          .Setter([&boot_build_target](const FlagMatch& m) {
+          .Setter([&boot_build_target](const FlagMatch& m) -> Result<void> {
             boot_build_target = m.value;
-            return true;
+            return {};
           }));
   std::optional<std::string> boot_branch;
   flags.emplace_back(
       Flag()
           .Alias({FlagAliasMode::kFlagConsumesFollowing, "--boot-branch"})
           .Alias({FlagAliasMode::kFlagConsumesFollowing, "--boot_branch"})
-          .Setter([&boot_branch](const FlagMatch& m) {
+          .Setter([&boot_branch](const FlagMatch& m) -> Result<void> {
             boot_branch = m.value;
-            return true;
+            return {};
           }));
   std::optional<std::string> boot_artifact;
   flags.emplace_back(
       Flag()
           .Alias({FlagAliasMode::kFlagConsumesFollowing, "--boot-artifact"})
           .Alias({FlagAliasMode::kFlagConsumesFollowing, "--boot_artifact"})
-          .Setter([&boot_artifact](const FlagMatch& m) {
+          .Setter([&boot_artifact](const FlagMatch& m) -> Result<void> {
             boot_artifact = m.value;
-            return true;
+            return {};
           }));
 
   std::optional<std::string> ota_build_id;
@@ -219,90 +219,92 @@
       Flag()
           .Alias({FlagAliasMode::kFlagConsumesFollowing, "--ota-build-id"})
           .Alias({FlagAliasMode::kFlagConsumesFollowing, "--ota_build_id"})
-          .Setter([&ota_build_id](const FlagMatch& m) {
+          .Setter([&ota_build_id](const FlagMatch& m) -> Result<void> {
             ota_build_id = m.value;
-            return true;
+            return {};
           }));
   std::optional<std::string> ota_build_target;
   flags.emplace_back(
       Flag()
           .Alias({FlagAliasMode::kFlagConsumesFollowing, "--ota-build-target"})
           .Alias({FlagAliasMode::kFlagConsumesFollowing, "--ota_build_target"})
-          .Setter([&ota_build_target](const FlagMatch& m) {
+          .Setter([&ota_build_target](const FlagMatch& m) -> Result<void> {
             ota_build_target = m.value;
-            return true;
+            return {};
           }));
   std::optional<std::string> ota_branch;
   flags.emplace_back(
       Flag()
           .Alias({FlagAliasMode::kFlagConsumesFollowing, "--ota-branch"})
           .Alias({FlagAliasMode::kFlagConsumesFollowing, "--ota_branch"})
-          .Setter([&ota_branch](const FlagMatch& m) {
+          .Setter([&ota_branch](const FlagMatch& m) -> Result<void> {
             ota_branch = m.value;
-            return true;
+            return {};
           }));
 
   std::optional<std::string> launch_args;
   flags.emplace_back(
       Flag()
           .Alias({FlagAliasMode::kFlagConsumesFollowing, "--launch-args"})
-          .Setter([&launch_args](const FlagMatch& m) {
+          .Setter([&launch_args](const FlagMatch& m) -> Result<void> {
             launch_args = m.value;
-            return true;
+            return {};
           }));
 
   std::optional<std::string> system_branch;
   flags.emplace_back(
       Flag()
           .Alias({FlagAliasMode::kFlagConsumesFollowing, "--system-branch"})
-          .Setter([&system_branch](const FlagMatch& m) {
+          .Setter([&system_branch](const FlagMatch& m) -> Result<void> {
             system_branch = m.value;
-            return true;
+            return {};
           }));
 
   std::optional<std::string> system_build_target;
-  flags.emplace_back(Flag()
-                         .Alias({FlagAliasMode::kFlagConsumesFollowing,
-                                 "--system-build-target"})
-                         .Setter([&system_build_target](const FlagMatch& m) {
-                           system_build_target = m.value;
-                           return true;
-                         }));
+  flags.emplace_back(
+      Flag()
+          .Alias(
+              {FlagAliasMode::kFlagConsumesFollowing, "--system-build-target"})
+          .Setter([&system_build_target](const FlagMatch& m) -> Result<void> {
+            system_build_target = m.value;
+            return {};
+          }));
 
   std::optional<std::string> system_build_id;
   flags.emplace_back(
       Flag()
           .Alias({FlagAliasMode::kFlagConsumesFollowing, "--system-build-id"})
-          .Setter([&system_build_id](const FlagMatch& m) {
+          .Setter([&system_build_id](const FlagMatch& m) -> Result<void> {
             system_build_id = m.value;
-            return true;
+            return {};
           }));
 
   std::optional<std::string> kernel_branch;
   flags.emplace_back(
       Flag()
           .Alias({FlagAliasMode::kFlagConsumesFollowing, "--kernel-branch"})
-          .Setter([&kernel_branch](const FlagMatch& m) {
+          .Setter([&kernel_branch](const FlagMatch& m) -> Result<void> {
             kernel_branch = m.value;
-            return true;
+            return {};
           }));
 
   std::optional<std::string> kernel_build_target;
-  flags.emplace_back(Flag()
-                         .Alias({FlagAliasMode::kFlagConsumesFollowing,
-                                 "--kernel-build-target"})
-                         .Setter([&kernel_build_target](const FlagMatch& m) {
-                           kernel_build_target = m.value;
-                           return true;
-                         }));
+  flags.emplace_back(
+      Flag()
+          .Alias(
+              {FlagAliasMode::kFlagConsumesFollowing, "--kernel-build-target"})
+          .Setter([&kernel_build_target](const FlagMatch& m) -> Result<void> {
+            kernel_build_target = m.value;
+            return {};
+          }));
 
   std::optional<std::string> kernel_build_id;
   flags.emplace_back(
       Flag()
           .Alias({FlagAliasMode::kFlagConsumesFollowing, "--kernel-build-id"})
-          .Setter([&kernel_build_id](const FlagMatch& m) {
+          .Setter([&kernel_build_id](const FlagMatch& m) -> Result<void> {
             kernel_build_id = m.value;
-            return true;
+            return {};
           }));
   bool use_16k = false;
   flags.emplace_back(Flag()
@@ -310,9 +312,9 @@
                          .Alias({FlagAliasMode::kFlagExact, "--16K"})
                          .Alias({FlagAliasMode::kFlagExact, "--use-16k"})
                          .Alias({FlagAliasMode::kFlagExact, "--use-16K"})
-                         .Setter([&use_16k](const FlagMatch&) {
+                         .Setter([&use_16k](const FlagMatch&) -> Result<void> {
                            use_16k = true;
-                           return true;
+                           return {};
                          }));
 
   std::optional<std::string> pet_name;
@@ -320,9 +322,9 @@
   flags.emplace_back(
       GflagsCompatFlag("pet-name")
           .Getter([&pet_name]() { return (pet_name ? *pet_name : ""); })
-          .Setter([&pet_name](const FlagMatch& match) {
+          .Setter([&pet_name](const FlagMatch& match) -> Result<void> {
             pet_name = match.value;
-            return true;
+            return {};
           }));
 
   CF_EXPECT(ParseFlags(flags, arguments));
diff --git a/host/commands/cvd/acloud/converter_parser_common.h b/host/commands/cvd/acloud/converter_parser_common.h
index 8274145..f3422d5 100644
--- a/host/commands/cvd/acloud/converter_parser_common.h
+++ b/host/commands/cvd/acloud/converter_parser_common.h
@@ -42,9 +42,9 @@
   for (const auto& alias_name : alias_names) {
     new_flag.Alias({FlagAliasMode::kFlagConsumesFollowing, "--" + alias_name});
   }
-  new_flag.Setter([&opt](const FlagMatch& m) {
+  new_flag.Setter([&opt](const FlagMatch& m) -> Result<void> {
     opt = m.value;
-    return true;
+    return {};
   });
   return new_flag;
 }
diff --git a/host/commands/cvd/acloud/create_converter_parser.cpp b/host/commands/cvd/acloud/create_converter_parser.cpp
index 816e58d..ba9a527 100644
--- a/host/commands/cvd/acloud/create_converter_parser.cpp
+++ b/host/commands/cvd/acloud/create_converter_parser.cpp
@@ -32,22 +32,21 @@
   auto local_instance_flag = Flag();
   local_instance_flag.Alias(
       {FlagAliasMode::kFlagConsumesArbitrary, "--local-instance"});
-  local_instance_flag.Setter(
-      [&local_instance_set, &local_instance](const FlagMatch& m) {
-        local_instance_set = true;
-        if (m.value != "" && local_instance) {
-          LOG(ERROR) << "Instance number already set, was \"" << *local_instance
-                     << "\", now set to \"" << m.value << "\"";
-          return false;
-        } else if (m.value != "" && !local_instance) {
-          int value = -1;
-          if (!android::base::ParseInt(m.value, &value)) {
-            return false;
-          }
-          local_instance = value;
-        }
-        return true;
-      });
+  local_instance_flag.Setter([&local_instance_set, &local_instance](
+                                 const FlagMatch& m) -> Result<void> {
+    local_instance_set = true;
+    if (m.value != "" && local_instance) {
+      return CF_ERRF(
+          "Instance number already set, was \"{}\", now set to \"{}\"",
+          *local_instance, m.value);
+    } else if (m.value != "" && !local_instance) {
+      int value = -1;
+      CF_EXPECTF(android::base::ParseInt(m.value, &value),
+                 "Failed to parse \"{}\"", m.value);
+      local_instance = value;
+    }
+    return {};
+  });
   return local_instance_flag;
 }
 
@@ -56,9 +55,9 @@
                           .Alias({FlagAliasMode::kFlagExact, "-v"})
                           .Alias({FlagAliasMode::kFlagExact, "-vv"})
                           .Alias({FlagAliasMode::kFlagExact, "--verbose"})
-                          .Setter([&verbose](const FlagMatch&) {
+                          .Setter([&verbose](const FlagMatch&) -> Result<void> {
                             verbose = true;
-                            return true;
+                            return {};
                           });
   return verbose_flag;
 }
@@ -67,12 +66,13 @@
                            std::optional<std::string>& local_image_path) {
   return Flag()
       .Alias({FlagAliasMode::kFlagConsumesArbitrary, "--local-image"})
-      .Setter([&local_image_given, &local_image_path](const FlagMatch& m) {
+      .Setter([&local_image_given,
+               &local_image_path](const FlagMatch& m) -> Result<void> {
         local_image_given = true;
         if (m.value != "") {
           local_image_path = m.value;
         }
-        return true;
+        return {};
       });
 }
 
diff --git a/host/commands/cvd/handle_reset.cpp b/host/commands/cvd/handle_reset.cpp
index 2c11a81..73b653b 100644
--- a/host/commands/cvd/handle_reset.cpp
+++ b/host/commands/cvd/handle_reset.cpp
@@ -58,19 +58,20 @@
   bool is_confirmed_by_flag = false;
   std::string verbosity_flag_value;
 
-  Flag y_flag = Flag()
-                    .Alias({FlagAliasMode::kFlagExact, "-y"})
-                    .Alias({FlagAliasMode::kFlagExact, "--yes"})
-                    .Setter([&is_confirmed_by_flag](const FlagMatch&) {
-                      is_confirmed_by_flag = true;
-                      return true;
-                    });
+  Flag y_flag =
+      Flag()
+          .Alias({FlagAliasMode::kFlagExact, "-y"})
+          .Alias({FlagAliasMode::kFlagExact, "--yes"})
+          .Setter([&is_confirmed_by_flag](const FlagMatch&) -> Result<void> {
+            is_confirmed_by_flag = true;
+            return {};
+          });
   Flag help_flag = Flag()
                        .Alias({FlagAliasMode::kFlagExact, "-h"})
                        .Alias({FlagAliasMode::kFlagExact, "--help"})
-                       .Setter([&is_help](const FlagMatch&) {
+                       .Setter([&is_help](const FlagMatch&) -> Result<void> {
                          is_help = true;
-                         return true;
+                         return {};
                        });
   std::vector<Flag> flags{
       GflagsCompatFlag("device-by-cvd-only", device_by_cvd_only),
diff --git a/host/commands/cvd/server_command/load_configs.cpp b/host/commands/cvd/server_command/load_configs.cpp
index f905adc..5c3e7f9 100644
--- a/host/commands/cvd/server_command/load_configs.cpp
+++ b/host/commands/cvd/server_command/load_configs.cpp
@@ -347,10 +347,10 @@
     flags.emplace_back(GflagsCompatFlag("help", help));
     std::vector<std::string> overrides;
     FlagAlias alias = {FlagAliasMode::kFlagPrefix, "--override="};
-    flags.emplace_back(
-        Flag().Alias(alias).Setter([&overrides](const FlagMatch& m) {
+    flags.emplace_back(Flag().Alias(alias).Setter(
+        [&overrides](const FlagMatch& m) -> Result<void> {
           overrides.push_back(m.value);
-          return true;
+          return {};
         }));
     auto args = ParseInvocation(request.Message()).arguments;
     CF_EXPECT(ParseFlags(flags, args));
diff --git a/host/commands/cvd/server_command/serial_launch.cpp b/host/commands/cvd/server_command/serial_launch.cpp
index 65cd527..b78a5a7 100644
--- a/host/commands/cvd/server_command/serial_launch.cpp
+++ b/host/commands/cvd/server_command/serial_launch.cpp
@@ -69,34 +69,31 @@
 
 /** Returns a `Flag` object that accepts comma-separated unsigned integers. */
 template <typename T>
-Flag DeviceSpecificUintFlag(const std::string& name, std::vector<T>& values,
-                            const RequestWithStdio& request) {
+Flag DeviceSpecificUintFlag(const std::string& name, std::vector<T>& values) {
   return GflagsCompatFlag(name).Setter(
-      [&request, &values](const FlagMatch& match) {
+      [&values](const FlagMatch& match) -> Result<void> {
         auto parsed_values = android::base::Tokenize(match.value, ", ");
         for (auto& parsed_value : parsed_values) {
           std::uint32_t num = 0;
-          if (!android::base::ParseUint(parsed_value, &num)) {
-            constexpr char kError[] = "Failed to parse integer";
-            WriteAll(request.Out(), kError, sizeof(kError));
-            return false;
-          }
+          CF_EXPECTF(android::base::ParseUint(parsed_value, &num),
+                     "Failed to parse {} as an integer", parsed_value);
           values.push_back(num);
         }
-        return true;
+        return {};
       });
 }
 
 /** Returns a `Flag` object that accepts comma-separated strings. */
 Flag DeviceSpecificStringFlag(const std::string& name,
                               std::vector<std::string>& values) {
-  return GflagsCompatFlag(name).Setter([&values](const FlagMatch& match) {
-    auto parsed_values = android::base::Tokenize(match.value, ", ");
-    for (auto& parsed_value : parsed_values) {
-      values.push_back(parsed_value);
-    }
-    return true;
-  });
+  return GflagsCompatFlag(name).Setter(
+      [&values](const FlagMatch& match) -> Result<void> {
+        auto parsed_values = android::base::Tokenize(match.value, ", ");
+        for (auto& parsed_value : parsed_values) {
+          values.push_back(parsed_value);
+        }
+        return {};
+      });
 }
 
 std::string ParentDir(const uid_t uid) {
@@ -167,19 +164,19 @@
     flags.emplace_back(GflagsCompatFlag("verbose", verbose));
 
     std::vector<std::uint32_t> x_res;
-    flags.emplace_back(DeviceSpecificUintFlag("x_res", x_res, request));
+    flags.emplace_back(DeviceSpecificUintFlag("x_res", x_res));
 
     std::vector<std::uint32_t> y_res;
-    flags.emplace_back(DeviceSpecificUintFlag("y_res", y_res, request));
+    flags.emplace_back(DeviceSpecificUintFlag("y_res", y_res));
 
     std::vector<std::uint32_t> dpi;
-    flags.emplace_back(DeviceSpecificUintFlag("dpi", dpi, request));
+    flags.emplace_back(DeviceSpecificUintFlag("dpi", dpi));
 
     std::vector<std::uint32_t> cpus;
-    flags.emplace_back(DeviceSpecificUintFlag("cpus", cpus, request));
+    flags.emplace_back(DeviceSpecificUintFlag("cpus", cpus));
 
     std::vector<std::uint32_t> memory_mb;
-    flags.emplace_back(DeviceSpecificUintFlag("memory_mb", memory_mb, request));
+    flags.emplace_back(DeviceSpecificUintFlag("memory_mb", memory_mb));
 
     std::vector<std::string> setupwizard_mode;
     flags.emplace_back(
@@ -207,27 +204,20 @@
     auto& device_flag = flags.emplace_back();
     device_flag.Alias({FlagAliasMode::kFlagPrefix, "--device="});
     device_flag.Alias({FlagAliasMode::kFlagConsumesFollowing, "--device"});
-    device_flag.Setter(
-        [this, time, client_uid, &devices, &request](const FlagMatch& mat) {
-          auto lock = lock_file_manager_.TryAcquireUnusedLock();
-          if (!lock.ok()) {
-            WriteAll(request.Err(), lock.error().Message());
-            return false;
-          } else if (!lock->has_value()) {
-            constexpr char kError[] = "could not acquire instance lock";
-            WriteAll(request.Err(), kError, sizeof(kError));
-            return false;
-          }
-          int num = (*lock)->Instance();
-          std::string home_dir = ParentDir(client_uid) + std::to_string(time) +
-                                 "_" + std::to_string(num) + "/";
-          devices.emplace_back(Device{
-              .build = mat.value,
-              .home_dir = std::move(home_dir),
-              .ins_lock = std::move(**lock),
-          });
-          return true;
-        });
+    device_flag.Setter([this, time, client_uid,
+                        &devices](const FlagMatch& mat) -> Result<void> {
+      auto lock = CF_EXPECT(lock_file_manager_.TryAcquireUnusedLock());
+      CF_EXPECT(lock.has_value(), "could not acquire instance lock");
+      int num = lock->Instance();
+      std::string home_dir = ParentDir(client_uid) + std::to_string(time) +
+                             "_" + std::to_string(num) + "/";
+      devices.emplace_back(Device{
+          .build = mat.value,
+          .home_dir = std::move(home_dir),
+          .ins_lock = std::move(*lock),
+      });
+      return {};
+    });
 
     auto args = ParseInvocation(request.Message()).arguments;
     for (const auto& arg : args) {
diff --git a/host/commands/display/main.cpp b/host/commands/display/main.cpp
index 87f1dab..d41ba78 100644
--- a/host/commands/display/main.cpp
+++ b/host/commands/display/main.cpp
@@ -189,9 +189,9 @@
   const std::vector<Flag> remove_displays_flags = {
       GflagsCompatFlag(kDisplayFlag)
           .Help("Display id of a display to remove.")
-          .Setter([&](const FlagMatch& match) {
+          .Setter([&](const FlagMatch& match) -> Result<void> {
             displays.push_back(match.value);
-            return true;
+            return {};
           }),
   };
   auto parse_res = ParseFlags(remove_displays_flags, args);
diff --git a/host/libs/config/adb/flags.cpp b/host/libs/config/adb/flags.cpp
index 6606d34..0440f61 100644
--- a/host/libs/config/adb/flags.cpp
+++ b/host/libs/config/adb/flags.cpp
@@ -36,13 +36,14 @@
       }
       return modes.str().substr(1);  // First comma
     });
-    mode_flag_.Setter([this](const FlagMatch& match) {
+    mode_flag_.Setter([this](const FlagMatch& match) -> Result<void> {
       // TODO(schuffelen): Error on unknown types?
       std::set<AdbMode> modes;
       for (auto& mode : android::base::Split(match.value, ",")) {
         modes.insert(StringToAdbMode(mode));
       }
-      return config_.SetModes(modes);
+      CF_EXPECT(config_.SetModes(modes));
+      return {};
     });
   }
 
diff --git a/host/libs/config/config_flag.cpp b/host/libs/config/config_flag.cpp
index 457d60d..fd5bfce 100644
--- a/host/libs/config/config_flag.cpp
+++ b/host/libs/config/config_flag.cpp
@@ -123,7 +123,10 @@
         "device/google/cuttlefish/shared/config/config_*.json for possible "
         "values.";
     auto getter = [this]() { return config_; };
-    auto setter = [this](const FlagMatch& m) { return ChooseConfig(m.value); };
+    auto setter = [this](const FlagMatch& m) -> Result<void> {
+      CF_EXPECT(ChooseConfig(m.value));
+      return {};
+    };
     flag_ = GflagsCompatFlag("config").Help(help).Getter(getter).Setter(setter);
   }
 
@@ -163,15 +166,13 @@
   }
 
  private:
-  bool ChooseConfig(const std::string& name) {
-    if (!config_reader_.HasConfig(name)) {
-      LOG(ERROR) << "Invalid --config option '" << name << "'. Valid options: "
-                 << android::base::Join(config_reader_.AvailableConfigs(), ",");
-      return false;
-    }
+  Result<void> ChooseConfig(const std::string& name) {
+    CF_EXPECTF(config_reader_.HasConfig(name),
+               "Invalid --config option '{}'. Valid options: [{}]", name,
+               fmt::join(config_reader_.AvailableConfigs(), ","));
     config_ = name;
     is_default_ = false;
-    return true;
+    return {};
   }
   std::optional<std::string> FindAndroidInfoConfig() const {
     auto info_path = system_image_dir_flag_.Path() + "/android-info.txt";
diff --git a/host/libs/config/custom_actions.cpp b/host/libs/config/custom_actions.cpp
index e98c46c..87aa948 100644
--- a/host/libs/config/custom_actions.cpp
+++ b/host/libs/config/custom_actions.cpp
@@ -213,19 +213,19 @@
         "empty then the custom action config will be empty as well.");
     custom_action_config_flag_.Getter(
         [this]() { return custom_action_config_[0]; });
-    custom_action_config_flag_.Setter([this](const FlagMatch& match) {
-      if (!match.value.empty() &&
-          (match.value == "unset" || match.value == "\"unset\"")) {
-        custom_action_config_.push_back(DefaultCustomActionConfig());
-      } else if (!match.value.empty() && !FileExists(match.value)) {
-        LOG(ERROR) << "custom_action_config file \"" << match.value << "\" "
-                   << "does not exist.";
-        return false;
-      } else {
-        custom_action_config_.push_back(match.value);
-      }
-      return true;
-    });
+    custom_action_config_flag_.Setter(
+        [this](const FlagMatch& match) -> Result<void> {
+          if (!match.value.empty() &&
+              (match.value == "unset" || match.value == "\"unset\"")) {
+            custom_action_config_.push_back(DefaultCustomActionConfig());
+          } else if (!match.value.empty() && !FileExists(match.value)) {
+            return CF_ERRF("custom_action_config file \"{}\" does not exist.",
+                           match.value);
+          } else {
+            custom_action_config_.push_back(match.value);
+          }
+          return {};
+        });
     // TODO(schuffelen): Access ConfigFlag directly for these values.
     custom_actions_flag_ = GflagsCompatFlag("custom_actions");
     custom_actions_flag_.Help(
@@ -234,23 +234,16 @@
         "preset config files; prefer --custom_action_config to specify a "
         "custom config file on the command line. Actions in this flag are "
         "combined with actions in --custom_action_config.");
-    custom_actions_flag_.Setter([this](const FlagMatch& match) {
+    custom_actions_flag_.Setter([this](const FlagMatch& match) -> Result<void> {
       // Load the custom action from the --config preset file.
       if (match.value == "unset" || match.value == "\"unset\"") {
         AddEmptyJsonCustomActionConfigs();
-        return true;
+        return {};
       }
-      Json::CharReaderBuilder builder;
-      std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
-      std::string errorMessage;
-      Json::Value custom_action_array(Json::arrayValue);
-      if (!reader->parse(&*match.value.begin(), &*match.value.end(),
-                         &custom_action_array, &errorMessage)) {
-        LOG(ERROR) << "Could not read custom actions config flag: "
-                   << errorMessage;
-        return false;
-      }
-      return AddJsonCustomActionConfigs(custom_action_array);
+      auto custom_action_array = CF_EXPECT(
+          ParseJson(match.value), "Could not read custom actions config flag");
+      CF_EXPECT(AddJsonCustomActionConfigs(custom_action_array));
+      return {};
     });
   }
 
diff --git a/host/libs/config/display.cpp b/host/libs/config/display.cpp
index 0e5a111..6c6540d 100644
--- a/host/libs/config/display.cpp
+++ b/host/libs/config/display.cpp
@@ -111,9 +111,9 @@
           .Help(kDisplayHelp),
       GflagsCompatFlag(kDisplayFlag)
           .Help(kDisplayHelp)
-          .Setter([&](const FlagMatch& match) {
+          .Setter([&](const FlagMatch& match) -> Result<void> {
             repeated_display_flag_values.push_back(match.value);
-            return true;
+            return {};
           }),
   };
 
@@ -148,4 +148,4 @@
   return displays_configs;
 }
 
-}  // namespace cuttlefish
\ No newline at end of file
+}  // namespace cuttlefish