diff --git a/lix/libstore/build/local-derivation-goal.cc b/lix/libstore/build/local-derivation-goal.cc index 48868105e..d1e1f2cfb 100644 --- a/lix/libstore/build/local-derivation-goal.cc +++ b/lix/libstore/build/local-derivation-goal.cc @@ -14,7 +14,7 @@ #include "lix/libstore/daemon.hh" #include "lix/libutil/result.hh" #include "lix/libutil/topo-sort.hh" -#include "lix/libutil/json-utils.hh" +#include "lix/libutil/json.hh" #include "lix/libutil/cgroup.hh" #include "lix/libstore/build/personality.hh" #include "lix/libutil/namespaces.hh" diff --git a/lix/libstore/derivations.cc b/lix/libstore/derivations.cc index 8ab203519..9553117cb 100644 --- a/lix/libstore/derivations.cc +++ b/lix/libstore/derivations.cc @@ -7,7 +7,6 @@ #include "lix/libutil/types.hh" #include "lix/libstore/common-protocol.hh" #include "lix/libstore/common-protocol-impl.hh" -#include "lix/libutil/json-utils.hh" #include "lix/libutil/strings.hh" #include "lix/libutil/backed-string-view.hh" diff --git a/lix/libutil/abstract-setting-to-json.hh b/lix/libutil/abstract-setting-to-json.hh index 9a0ba0532..f8f8c9636 100644 --- a/lix/libutil/abstract-setting-to-json.hh +++ b/lix/libutil/abstract-setting-to-json.hh @@ -2,7 +2,6 @@ ///@file #include "lix/libutil/config.hh" -#include "lix/libutil/json-utils.hh" // Required for instances of to_json and from_json for ExperimentalFeature #include "lix/libutil/experimental-features-json.hh" #include "lix/libutil/json.hh" diff --git a/lix/libutil/args.cc b/lix/libutil/args.cc index 573382a5f..cb7eb9662 100644 --- a/lix/libutil/args.cc +++ b/lix/libutil/args.cc @@ -2,7 +2,7 @@ #include "lix/libutil/args/root.hh" #include "lix/libutil/hash.hh" #include "lix/libutil/strings.hh" -#include "lix/libutil/json-utils.hh" // IWYU pragma: keep (instances) +#include "lix/libutil/json.hh" // IWYU pragma: keep (instances) #include "lix/libutil/environment-variables.hh" #include "lix/libutil/experimental-features-json.hh" // IWYU pragma: keep (instances) diff --git a/lix/libutil/deprecated-features-json.hh b/lix/libutil/deprecated-features-json.hh index 913c437cd..e99613df0 100644 --- a/lix/libutil/deprecated-features-json.hh +++ b/lix/libutil/deprecated-features-json.hh @@ -2,7 +2,7 @@ ///@file #include "lix/libutil/deprecated-features.hh" -#include "lix/libutil/json-utils.hh" +#include "lix/libutil/json-fwd.hh" namespace nix { diff --git a/lix/libutil/experimental-features-json.hh b/lix/libutil/experimental-features-json.hh index 8329c7e41..1f34ccd52 100644 --- a/lix/libutil/experimental-features-json.hh +++ b/lix/libutil/experimental-features-json.hh @@ -2,7 +2,7 @@ ///@file #include "lix/libutil/experimental-features.hh" -#include "lix/libutil/json-utils.hh" +#include "lix/libutil/json-fwd.hh" namespace nix { diff --git a/lix/libutil/json-utils.cc b/lix/libutil/json-utils.cc index 5f6d9c6c1..caa11a41e 100644 --- a/lix/libutil/json-utils.cc +++ b/lix/libutil/json-utils.cc @@ -1,4 +1,4 @@ -#include "lix/libutil/json-utils.hh" +#include "lix/libutil/json.hh" #include "lix/libutil/error.hh" namespace nix { diff --git a/lix/libutil/json-utils.hh b/lix/libutil/json-utils.hh deleted file mode 100644 index 9a955d9c6..000000000 --- a/lix/libutil/json-utils.hh +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once -///@file - -#include "lix/libutil/json.hh" - -/** - * This "instance" is widely requested, see - * https://github.com/nlohmann/json/issues/1749, but momentum has stalled - * out. Writing there here in Nix as a stop-gap. - * - * We need to make sure the underlying type does not use `null` for this to - * round trip. We do that with a static assert. - */ -template -struct nix::json::adl_serializer> { - /** - * @brief Convert a JSON type to an `optional` treating - * `null` as `std::nullopt`. - */ - static void from_json(const auto & json, std::optional & t) { - static_assert( - nix::json::avoids_null::value, - "null is already in use for underlying type's JSON"); - t = json.is_null() - ? std::nullopt - : std::make_optional(json.template get()); - } - - /** - * @brief Convert an optional type to a JSON type treating `std::nullopt` - * as `null`. - */ - static void to_json(auto & json, const std::optional & t) { - static_assert( - nix::json::avoids_null::value, - "null is already in use for underlying type's JSON"); - if (t) - json = *t; - else - json = nullptr; - } -}; diff --git a/lix/libutil/json.hh b/lix/libutil/json.hh index 9ecee6e20..03e452b38 100644 --- a/lix/libutil/json.hh +++ b/lix/libutil/json.hh @@ -105,6 +105,34 @@ struct adl_serializer return T::from_json(std::forward(j)); } }; + +template +struct adl_serializer> +{ + /** + * @brief Convert a JSON type to an `optional` treating + * `null` as `std::nullopt`. + */ + static void from_json(const auto & json, std::optional & t) + { + static_assert(avoids_null::value, "null is already in use for underlying type's JSON"); + t = json.is_null() ? std::nullopt : std::make_optional(json.template get()); + } + + /** + * @brief Convert an optional type to a JSON type treating `std::nullopt` + * as `null`. + */ + static void to_json(auto & json, const std::optional & t) + { + static_assert(avoids_null::value, "null is already in use for underlying type's JSON"); + if (t) { + json = *t; + } else { + json = nullptr; + } + } +}; } } diff --git a/lix/libutil/meson.build b/lix/libutil/meson.build index 63ce56905..7a93b4981 100644 --- a/lix/libutil/meson.build +++ b/lix/libutil/meson.build @@ -95,7 +95,6 @@ libutil_headers = files( 'input-accessor.hh', 'json.hh', 'json-fwd.hh', - 'json-utils.hh', 'logging.hh', 'logging-json.hh', 'lru-cache.hh', diff --git a/tests/unit/libutil/json-utils.cc b/tests/unit/libutil/json-utils.cc index 77cd56034..a08137312 100644 --- a/tests/unit/libutil/json-utils.cc +++ b/tests/unit/libutil/json-utils.cc @@ -3,7 +3,7 @@ #include -#include "lix/libutil/json-utils.hh" +#include "lix/libutil/json.hh" namespace nix {