#pragma once #include "util.hh" #include "path.hh" #include "path-with-outputs.hh" #include "derived-path.hh" #include "eval.hh" #include "flake/flake.hh" #include namespace nix { struct DrvInfo; struct SourceExprCommand; namespace eval_cache { class EvalCache; class AttrCursor; } struct App { std::vector context; Path program; // FIXME: add args, sandbox settings, metadata, ... }; struct UnresolvedApp { App unresolved; App resolve(ref evalStore, ref store); }; struct Installable { virtual ~Installable() { } virtual std::string what() const = 0; virtual DerivedPaths toDerivedPaths() = 0; virtual StorePathSet toDrvPaths(ref store) { throw Error("'%s' cannot be converted to a derivation path", what()); } DerivedPath toDerivedPath(); UnresolvedApp 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>> getCursors(EvalState & state); std::pair, std::string> getCursor(EvalState & state); virtual FlakeRef nixpkgsFlakeRef() const { return FlakeRef::fromAttrs({{"type","indirect"}, {"id", "nixpkgs"}}); } }; struct InstallableValue : Installable { ref state; InstallableValue(ref state) : state(state) {} struct DerivationInfo { StorePath drvPath; std::optional outPath; std::string outputName; }; virtual std::vector toDerivations() = 0; DerivedPaths toDerivedPaths() override; StorePathSet toDrvPaths(ref store) override; }; struct InstallableFlake : InstallableValue { FlakeRef flakeRef; Strings attrPaths; Strings prefixes; const flake::LockFlags & lockFlags; mutable std::shared_ptr _lockedFlake; InstallableFlake( SourceExprCommand * cmd, ref state, FlakeRef && flakeRef, Strings && attrPaths, Strings && prefixes, const flake::LockFlags & lockFlags); std::string what() const 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>> getCursors(EvalState & state) override; std::shared_ptr getLockedFlake() const; FlakeRef nixpkgsFlakeRef() const override; }; ref openEvalCache( EvalState & state, std::shared_ptr lockedFlake); }