#pragma once #include "util.hh" #include "path.hh" #include "eval.hh" #include "flake/flake.hh" #include namespace nix { struct DrvInfo; struct SourceExprCommand; namespace eval_cache { class EvalCache; class AttrCursor; } struct Buildable { std::optional drvPath; std::map outputs; }; typedef std::vector Buildables; struct App { PathSet context; Path program; // FIXME: add args, sandbox settings, metadata, ... App(EvalState & state, Value & vApp); }; struct Installable { virtual ~Installable() { } virtual std::string what() = 0; virtual Buildables toBuildables() = 0; Buildable toBuildable(); App toApp(EvalState & state); virtual std::pair toValue(EvalState & state) { throw Error("argument '%s' cannot be evaluated", what()); } /* Return a value only if this installable is a store path or a symlink to it. */ virtual std::optional getStorePath() { return {}; } virtual std::vector, std::string>> getCursor(EvalState & state, bool useEvalCache); virtual FlakeRef nixpkgsFlakeRef() const { return std::move(FlakeRef::fromAttrs({{"type","indirect"}, {"id", "nixpkgs"}})); } }; struct InstallableValue : Installable { ref state; InstallableValue(ref state) : state(state) {} struct DerivationInfo { StorePath drvPath; StorePath outPath; std::string outputName; }; virtual std::vector toDerivations() = 0; Buildables toBuildables() override; }; struct InstallableFlake : InstallableValue { FlakeRef flakeRef; Strings attrPaths; Strings prefixes; const flake::LockFlags & lockFlags; InstallableFlake(ref state, FlakeRef && flakeRef, Strings && attrPaths, Strings && prefixes, const flake::LockFlags & lockFlags) : InstallableValue(state), flakeRef(flakeRef), attrPaths(attrPaths), prefixes(prefixes), lockFlags(lockFlags) { } std::string what() override { return flakeRef.to_string() + "#" + *attrPaths.begin(); } std::vector getActualAttrPaths(); Value * getFlakeOutputs(EvalState & state, const flake::LockedFlake & lockedFlake); std::tuple toDerivation(); std::vector toDerivations() override; std::pair toValue(EvalState & state) override; std::vector, std::string>> getCursor(EvalState & state, bool useEvalCache) override; FlakeRef nixpkgsFlakeRef() const override; }; ref openEvalCache( EvalState & state, std::shared_ptr lockedFlake, bool useEvalCache); }