#pragma once ///@file #include "sync.hh" #include "hash.hh" #include "eval.hh" #include #include namespace nix::eval_cache { struct AttrDb; class AttrCursor; struct CachedEvalError : EvalError { const ref cursor; const Symbol attr; CachedEvalError(ref cursor, Symbol attr); /** * Evaluate this attribute, which should result in a regular * `EvalError` exception being thrown. */ [[noreturn]] void force(); }; class EvalCache : public std::enable_shared_from_this { friend class AttrCursor; friend class CachedEvalError; std::shared_ptr db; EvalState & state; typedef std::function RootLoader; RootLoader rootLoader; RootValue value; Value * getRootValue(); public: EvalCache( std::optional> useCache, EvalState & state, RootLoader rootLoader); ref getRoot(); }; enum AttrType { Placeholder = 0, FullAttrs = 1, String = 2, Missing = 3, Misc = 4, Failed = 5, Bool = 6, ListOfStrings = 7, Int = 8, }; struct placeholder_t {}; struct missing_t {}; struct misc_t {}; struct failed_t {}; struct int_t { NixInt x; }; typedef uint64_t AttrId; typedef std::pair AttrKey; typedef std::pair string_t; typedef std::variant< std::vector, string_t, placeholder_t, missing_t, misc_t, failed_t, bool, int_t, std::vector > AttrValue; class AttrCursor : public std::enable_shared_from_this { friend class EvalCache; friend class CachedEvalError; ref root; typedef std::optional, Symbol>> Parent; Parent parent; RootValue _value; std::optional> cachedValue; AttrKey getKey(); Value & getValue(); public: AttrCursor( ref root, Parent parent, Value * value = nullptr, std::optional> && cachedValue = {}); std::vector getAttrPath() const; std::vector getAttrPath(Symbol name) const; std::string getAttrPathStr() const; std::string getAttrPathStr(Symbol name) const; Suggestions getSuggestionsForAttr(Symbol name); std::shared_ptr maybeGetAttr(Symbol name); std::shared_ptr maybeGetAttr(std::string_view name); ref getAttr(Symbol name); ref getAttr(std::string_view name); /** * Get an attribute along a chain of attrsets. Note that this does * not auto-call functors or functions. */ OrSuggestions> findAlongAttrPath(const std::vector & attrPath); std::string getString(); string_t getStringWithContext(); bool getBool(); NixInt getInt(); std::vector getListOfStrings(); std::vector getAttrs(); bool isDerivation(); Value & forceValue(); /** * Force creation of the .drv file in the Nix store. */ StorePath forceDerivation(); }; }