af99941279
Rather than having them plain strings scattered through the whole codebase, create an enum containing all the known experimental features. This means that - Nix can now `warn` when an unkwown experimental feature is passed (making it much nicer to spot typos and spot deprecated features) - It’s now easy to remove a feature altogether (once the feature isn’t experimental anymore or is dropped) by just removing the field for the enum and letting the compiler point us to all the now invalid usages of it.
57 lines
1.3 KiB
C++
57 lines
1.3 KiB
C++
#pragma once
|
||
|
||
#include "comparator.hh"
|
||
#include "error.hh"
|
||
#include "nlohmann/json_fwd.hpp"
|
||
#include "types.hh"
|
||
|
||
namespace nix {
|
||
|
||
/**
|
||
* The list of available experimental features.
|
||
*
|
||
* If you update this, don’t forget to also change the map defining their
|
||
* string representation in the corresponding `.cc` file.
|
||
**/
|
||
enum struct ExperimentalFeature
|
||
{
|
||
CaDerivations,
|
||
Flakes,
|
||
NixCommand,
|
||
RecursiveNix,
|
||
NoUrlLiterals
|
||
};
|
||
|
||
/**
|
||
* Just because writing `ExperimentalFeature::CaDerivations` is way too long
|
||
*/
|
||
using Xp = ExperimentalFeature;
|
||
|
||
const std::optional<ExperimentalFeature> parseExperimentalFeature(
|
||
const std::string_view & name);
|
||
std::string_view showExperimentalFeature(const ExperimentalFeature);
|
||
|
||
std::ostream & operator<<(
|
||
std::ostream & str,
|
||
const ExperimentalFeature & feature);
|
||
|
||
/**
|
||
* Parse a set of strings to the corresponding set of experimental features,
|
||
* ignoring (but warning for) any unkwown feature.
|
||
*/
|
||
std::set<ExperimentalFeature> parseFeatures(const std::set<std::string> &);
|
||
|
||
class MissingExperimentalFeature : public Error
|
||
{
|
||
public:
|
||
ExperimentalFeature missingFeature;
|
||
|
||
MissingExperimentalFeature(ExperimentalFeature);
|
||
virtual const char * sname() const override
|
||
{
|
||
return "MissingExperimentalFeature";
|
||
}
|
||
};
|
||
|
||
}
|