aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/outputs-spec.cc
diff options
context:
space:
mode:
authorJohn Ericson <John.Ericson@Obsidian.Systems>2023-01-11 16:32:30 -0500
committerJohn Ericson <John.Ericson@Obsidian.Systems>2023-01-11 19:08:19 -0500
commit5ba6e5d0d9bed2806ddb59c8a3305b3cb5784d53 (patch)
tree065e7eccec8a228a4045a434c4d5a1de5aa0cf3b /src/libstore/outputs-spec.cc
parent114a6e2b09eda7f23e7776e1cdf77715044e073e (diff)
Remove default constructor from `OutputsSpec`
This forces us to be explicit. It also requires to rework how `from_json` works. A `JSON_IMPL` is added to assist with this.
Diffstat (limited to 'src/libstore/outputs-spec.cc')
-rw-r--r--src/libstore/outputs-spec.cc53
1 files changed, 26 insertions, 27 deletions
diff --git a/src/libstore/outputs-spec.cc b/src/libstore/outputs-spec.cc
index 891252990..1eeab1aa8 100644
--- a/src/libstore/outputs-spec.cc
+++ b/src/libstore/outputs-spec.cc
@@ -110,9 +110,21 @@ bool OutputsSpec::merge(const OutputsSpec & that)
}, raw());
}
+}
-void to_json(nlohmann::json & json, const OutputsSpec & outputsSpec)
-{
+namespace nlohmann {
+
+using namespace nix;
+
+OutputsSpec adl_serializer<OutputsSpec>::from_json(const json & json) {
+ auto names = json.get<StringSet>();
+ if (names == StringSet({"*"}))
+ return OutputsSpec::All {};
+ else
+ return OutputsSpec::Names { std::move(names) };
+}
+
+void adl_serializer<OutputsSpec>::to_json(json & json, OutputsSpec t) {
std::visit(overloaded {
[&](const OutputsSpec::All &) {
json = std::vector<std::string>({"*"});
@@ -120,40 +132,27 @@ void to_json(nlohmann::json & json, const OutputsSpec & outputsSpec)
[&](const OutputsSpec::Names & names) {
json = names;
},
- }, outputsSpec);
+ }, t);
}
-void to_json(nlohmann::json & json, const ExtendedOutputsSpec & extendedOutputsSpec)
-{
+ExtendedOutputsSpec adl_serializer<ExtendedOutputsSpec>::from_json(const json & json) {
+ if (json.is_null())
+ return ExtendedOutputsSpec::Default {};
+ else {
+ return ExtendedOutputsSpec::Explicit { json.get<OutputsSpec>() };
+ }
+}
+
+void adl_serializer<ExtendedOutputsSpec>::to_json(json & json, ExtendedOutputsSpec t) {
std::visit(overloaded {
[&](const ExtendedOutputsSpec::Default &) {
json = nullptr;
},
[&](const ExtendedOutputsSpec::Explicit & e) {
- to_json(json, e);
+ adl_serializer<OutputsSpec>::to_json(json, e);
},
- }, extendedOutputsSpec);
-}
-
-
-void from_json(const nlohmann::json & json, OutputsSpec & outputsSpec)
-{
- auto names = json.get<StringSet>();
- if (names == StringSet({"*"}))
- outputsSpec = OutputsSpec::All {};
- else
- outputsSpec = OutputsSpec::Names { std::move(names) };
-}
-
-
-void from_json(const nlohmann::json & json, ExtendedOutputsSpec & extendedOutputsSpec)
-{
- if (json.is_null())
- extendedOutputsSpec = ExtendedOutputsSpec::Default {};
- else {
- extendedOutputsSpec = ExtendedOutputsSpec::Explicit { json.get<OutputsSpec>() };
- }
+ }, t);
}
}