aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Ericson <John.Ericson@Obsidian.Systems>2023-04-04 22:57:11 -0400
committerJohn Ericson <John.Ericson@Obsidian.Systems>2023-04-04 22:57:11 -0400
commit53d0836347ea262884658036f97bf19ecbdc5c26 (patch)
tree1e44ef6c424772ee311c34b4dcd772ac7a3ad96c /src
parent3f98353f196bfd1da3641751f4f7826f42581893 (diff)
Assemble experimental feature docs outside of Nix itself
Instead of constructing a markdown list in C++ (which involved all sorts of nasty string literals), export some JSON and assemble it with the manual build system. Besides following the precedent set with other dumped data, this is a better separate of content and presentation; if we decide for example we want to display this information in a different way, or in a different section of the manual, it will become much easier to do so.
Diffstat (limited to 'src')
-rw-r--r--src/libutil/config.hh17
-rw-r--r--src/libutil/experimental-features.cc32
-rw-r--r--src/libutil/experimental-features.hh6
-rw-r--r--src/nix/main.cc5
4 files changed, 28 insertions, 32 deletions
diff --git a/src/libutil/config.hh b/src/libutil/config.hh
index a001056f7..8b0fe6555 100644
--- a/src/libutil/config.hh
+++ b/src/libutil/config.hh
@@ -371,8 +371,21 @@ extern GlobalConfig globalConfig;
struct ExperimentalFeatureSettings : Config {
- Setting<std::set<ExperimentalFeature>> experimentalFeatures{this, {}, "experimental-features",
- getExperimentalFeaturesList()};
+ Setting<std::set<ExperimentalFeature>> experimentalFeatures{
+ this, {}, "experimental-features",
+ R"(
+ Experimental features that are enabled.
+
+ Example:
+
+ ```
+ experimental-features = nix-command flakes
+ ```
+
+ Experimental features available:
+
+ {{#include experimental-features.md}}
+ )"};
/**
* Check whether the given experimental feature is enabled.
diff --git a/src/libutil/experimental-features.cc b/src/libutil/experimental-features.cc
index a64e9715a..010ab1d68 100644
--- a/src/libutil/experimental-features.cc
+++ b/src/libutil/experimental-features.cc
@@ -140,32 +140,12 @@ std::string_view showExperimentalFeature(const ExperimentalFeature tag)
return xpFeatureDetails[(size_t)tag].name;
}
-std::string getExperimentalFeaturesList() {
- std::string experimentalFeaturesList = R"(
- Experimental features that can be enabled.
-
- Example:
-
- ```
- experimental-features = nix-command flakes
-
- Experimental features available:
-
-)";
-
- for (auto & xpFeature : xpFeatureDetails) {
- experimentalFeaturesList += std::string {}
- /* length of this first string must be 12, matching the indent of
- the descriptions in the xpFeatureDetails literal. FIXME compute
- markdown in a less hacky way. */
- + " - "
- + "`" + xpFeature.name + "`"
- + "\n"
- + xpFeature.description
- + "\n\n";
- }
-
- return experimentalFeaturesList;
+nlohmann::json documentExperimentalFeatures() {
+ StringMap res;
+ for (auto & xpFeature : xpFeatureDetails)
+ res[std::string { xpFeature.name }] =
+ trim(stripIndentation(xpFeature.description));
+ return (nlohmann::json) res;
}
std::set<ExperimentalFeature> parseFeatures(const std::set<std::string> & rawFeatures)
diff --git a/src/libutil/experimental-features.hh b/src/libutil/experimental-features.hh
index 3c479dbd9..8ef66263a 100644
--- a/src/libutil/experimental-features.hh
+++ b/src/libutil/experimental-features.hh
@@ -51,11 +51,9 @@ std::string_view showExperimentalFeature(const ExperimentalFeature);
/**
* Compute the documentation of all experimental features.
*
- * This a markdown bulleted list where each item is first (a) the
- * experimental feature flag name in backticks, and then (b) the
- * description of the experimental feature.
+ * See `doc/manual` for how this information is used.
*/
-std::string getExperimentalFeaturesList();
+nlohmann::json documentExperimentalFeatures();
/**
* Shorthand for `str << showExperimentalFeature(feature)`.
diff --git a/src/nix/main.cc b/src/nix/main.cc
index 4d4164333..62b1f98d1 100644
--- a/src/nix/main.cc
+++ b/src/nix/main.cc
@@ -374,6 +374,11 @@ void mainWrapped(int argc, char * * argv)
return;
}
+ if (argc == 2 && std::string(argv[1]) == "__dump-xp-features") {
+ logger->cout(documentExperimentalFeatures().dump());
+ return;
+ }
+
Finally printCompletions([&]()
{
if (completions) {