aboutsummaryrefslogtreecommitdiff
path: root/src/libutil
diff options
context:
space:
mode:
authoreldritch horrors <pennae@lix.systems>2024-09-01 01:37:10 +0200
committereldritch horrors <pennae@lix.systems>2024-09-08 01:57:48 +0000
commit92eccfbd68f80e4a5d87556d43927d6dbaabae26 (patch)
tree85592c99de327af50f3976d84b016d7311c4ea42 /src/libutil
parent991d8ce2752d117c2431ddf8df454bda6df16a77 (diff)
libutil: add a result type using boost outcome
we're using boost::outcome rather than leaf or stl types because stl types are not available everywhere and leaf does not provide its own storage for error values, relying on thread-locals and the stack. if we want to use promises we won't have a stack and would have to wrap everything into leaf-specific allocating wrappers, so outcome it is. Change-Id: I35111a1f9ed517e7f12a839e2162b1ba6a993f8f
Diffstat (limited to 'src/libutil')
-rw-r--r--src/libutil/meson.build1
-rw-r--r--src/libutil/result.hh24
2 files changed, 25 insertions, 0 deletions
diff --git a/src/libutil/meson.build b/src/libutil/meson.build
index 1ac31c7eb..a3f21de59 100644
--- a/src/libutil/meson.build
+++ b/src/libutil/meson.build
@@ -105,6 +105,7 @@ libutil_headers = files(
'regex-combinators.hh',
'regex.hh',
'repair-flag.hh',
+ 'result.hh',
'serialise.hh',
'shlex.hh',
'signals.hh',
diff --git a/src/libutil/result.hh b/src/libutil/result.hh
new file mode 100644
index 000000000..b01766fe4
--- /dev/null
+++ b/src/libutil/result.hh
@@ -0,0 +1,24 @@
+#pragma once
+/// @file
+
+#include <boost/outcome/std_outcome.hpp>
+#include <boost/outcome/std_result.hpp>
+#include <boost/outcome/success_failure.hpp>
+#include <exception>
+
+namespace nix {
+
+template<typename T, typename E = std::exception_ptr>
+using Result = boost::outcome_v2::std_result<T, E>;
+
+template<typename T, typename D, typename E = std::exception_ptr>
+using Outcome = boost::outcome_v2::std_outcome<T, D, E>;
+
+namespace result {
+
+using boost::outcome_v2::success;
+using boost::outcome_v2::failure;
+
+}
+
+}