mirror of
https://github.com/NixOS/nix.git
synced 2025-12-16 22:11:05 +01:00
Parse deriving paths in DerivationOptions
This is an example of "Parse, don't validate" principle [1]. Before, we had a number of `StringSet`s in `DerivationOptions` that were not *actually* allowed to be arbitrary sets of strings. Instead, each set member had to be one of: - a store path - a CA "downstream placeholder" - an output name Only later, in the code that checks outputs, would these strings be further parsed to match these cases. (Actually, only 2 by that point, because the placeholders must be rewritten away by then.) Now, we fully parse everything up front, and have an "honest" data type that reflects these invariants: - store paths are parsed, stored as (opaque) deriving paths - CA "downstream placeholders" are rewritten to the output deriving paths they denote - output names are the only arbitrary strings left Since the first two cases both become deriving paths, that leaves us with a `std::variant<SingleDerivedPath, String>` data type, which we use in our sets instead. Getting rid of placeholders is especially nice because we are replacing them with something much more internally-structured / transparent. [1]: https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/ Co-authored-by: Sergei Zimmerman <sergei@zimmerman.foo> Co-authored-by: Eelco Dolstra <edolstra@gmail.com>
This commit is contained in:
parent
72dbd43882
commit
76bd600302
23 changed files with 731 additions and 260 deletions
|
|
@ -242,6 +242,28 @@ std::string stripIndentation(std::string_view s);
|
|||
*/
|
||||
std::pair<std::string_view, std::string_view> getLine(std::string_view s);
|
||||
|
||||
/**
|
||||
* Get a pointer to the contents of a `std::optional` if it is set, or a
|
||||
* null pointer otherise.
|
||||
*
|
||||
* Const version.
|
||||
*/
|
||||
template<class T>
|
||||
const T * get(const std::optional<T> & opt)
|
||||
{
|
||||
return opt ? &*opt : nullptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Non-const counterpart of `const T * get(const std::optional<T>)`.
|
||||
* Takes a mutable reference, but returns a mutable pointer.
|
||||
*/
|
||||
template<class T>
|
||||
T * get(std::optional<T> & opt)
|
||||
{
|
||||
return opt ? &*opt : nullptr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a value for the specified key from an associate container.
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue