2023-02-03 19:53:40 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "installables.hh"
|
2023-02-06 04:28:18 +00:00
|
|
|
#include "flake/flake.hh"
|
2023-02-03 19:53:40 +00:00
|
|
|
|
|
|
|
namespace nix {
|
|
|
|
|
2023-02-06 04:28:18 +00:00
|
|
|
struct DrvInfo;
|
|
|
|
struct SourceExprCommand;
|
|
|
|
|
|
|
|
namespace eval_cache { class EvalCache; class AttrCursor; }
|
|
|
|
|
2023-02-05 17:16:17 +00:00
|
|
|
struct App
|
|
|
|
{
|
|
|
|
std::vector<DerivedPath> context;
|
|
|
|
Path program;
|
|
|
|
// FIXME: add args, sandbox settings, metadata, ...
|
|
|
|
};
|
|
|
|
|
|
|
|
struct UnresolvedApp
|
|
|
|
{
|
|
|
|
App unresolved;
|
|
|
|
App resolve(ref<Store> evalStore, ref<Store> store);
|
|
|
|
};
|
|
|
|
|
2023-02-06 04:28:18 +00:00
|
|
|
/**
|
|
|
|
* Extra info about a \ref DerivedPath "derived path" that ultimately
|
|
|
|
* come from a Nix language value.
|
|
|
|
*
|
|
|
|
* Invariant: every ExtraPathInfo gotten from an InstallableValue should
|
|
|
|
* be possible to downcast to an ExtraPathInfoValue.
|
|
|
|
*/
|
|
|
|
struct ExtraPathInfoValue : ExtraPathInfo
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* Extra struct to get around C++ designated initializer limitations
|
|
|
|
*/
|
|
|
|
struct Value {
|
|
|
|
/**
|
|
|
|
* An optional priority for use with "build envs". See Package
|
|
|
|
*/
|
|
|
|
std::optional<NixInt> priority;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The attribute path associated with this value. The idea is
|
|
|
|
* that an installable referring to a value typically refers to
|
|
|
|
* a larger value, from which we project a smaller value out
|
|
|
|
* with this.
|
|
|
|
*/
|
|
|
|
std::string attrPath;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \todo merge with DerivedPath's 'outputs' field?
|
|
|
|
*/
|
|
|
|
ExtendedOutputsSpec extendedOutputsSpec;
|
|
|
|
};
|
|
|
|
|
|
|
|
Value value;
|
|
|
|
|
|
|
|
ExtraPathInfoValue(Value && v)
|
|
|
|
: value(v)
|
|
|
|
{ }
|
|
|
|
|
|
|
|
virtual ~ExtraPathInfoValue() = default;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* An Installable which corresponds a Nix langauge value, in addition to
|
|
|
|
* a collection of \ref DerivedPath "derived paths".
|
|
|
|
*/
|
2023-02-03 19:53:40 +00:00
|
|
|
struct InstallableValue : Installable
|
|
|
|
{
|
|
|
|
ref<EvalState> state;
|
|
|
|
|
|
|
|
InstallableValue(ref<EvalState> state) : state(state) {}
|
2023-02-05 17:16:17 +00:00
|
|
|
|
2023-02-06 04:28:18 +00:00
|
|
|
virtual ~InstallableValue() { }
|
|
|
|
|
2023-02-05 17:16:17 +00:00
|
|
|
virtual std::pair<Value *, PosIdx> toValue(EvalState & state) = 0;
|
|
|
|
|
2023-02-06 04:28:18 +00:00
|
|
|
/**
|
|
|
|
* Get a cursor to each value this Installable could refer to.
|
|
|
|
* However if none exists, throw exception instead of returning
|
|
|
|
* empty vector.
|
|
|
|
*/
|
2023-02-05 17:16:17 +00:00
|
|
|
virtual std::vector<ref<eval_cache::AttrCursor>>
|
|
|
|
getCursors(EvalState & state);
|
|
|
|
|
2023-02-06 04:28:18 +00:00
|
|
|
/**
|
|
|
|
* Get the first and most preferred cursor this Installable could
|
|
|
|
* refer to, or throw an exception if none exists.
|
|
|
|
*/
|
2023-02-05 17:16:17 +00:00
|
|
|
virtual ref<eval_cache::AttrCursor>
|
|
|
|
getCursor(EvalState & state);
|
|
|
|
|
|
|
|
UnresolvedApp toApp(EvalState & state);
|
|
|
|
|
2023-02-06 04:28:18 +00:00
|
|
|
virtual FlakeRef nixpkgsFlakeRef() const
|
|
|
|
{
|
|
|
|
return FlakeRef::fromAttrs({{"type","indirect"}, {"id", "nixpkgs"}});
|
|
|
|
}
|
|
|
|
|
2023-02-05 17:16:17 +00:00
|
|
|
static InstallableValue & require(Installable & installable);
|
|
|
|
static ref<InstallableValue> require(ref<Installable> installable);
|
2023-02-03 19:53:40 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|