diff options
author | Shea Levy <shea@shealevy.com> | 2014-11-30T18·16-0500 |
---|---|---|
committer | Shea Levy <shea@shealevy.com> | 2014-12-02T15·27-0500 |
commit | 320659b0cd161249c95e736c3fb309b1a73ea728 (patch) | |
tree | f58c49ae4828572d4642a4d02360f8a415a9f0f9 /src/libexpr/value.hh | |
parent | 5f04da905fcd01ea2d68cdbf7af41c836df5bb4e (diff) |
Allow external code using libnixexpr to add types
Code that links to libnixexpr (e.g. plugins loaded with importNative, or nix-exec) may want to provide custom value types and operations on values of those types. For example, nix-exec is currently using sets where a custom IO value type would be more appropriate. This commit provides a generic hook for such types in the form of tExternal and the ExternalBase virtual class, which contains all functions necessary for libnixexpr's type-polymorphic functions (e.g. `showType`) to be implemented.
Diffstat (limited to 'src/libexpr/value.hh')
-rw-r--r-- | src/libexpr/value.hh | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/libexpr/value.hh b/src/libexpr/value.hh index 5f18f629e632..227a81f2b635 100644 --- a/src/libexpr/value.hh +++ b/src/libexpr/value.hh @@ -19,6 +19,7 @@ typedef enum { tBlackhole, tPrimOp, tPrimOpApp, + tExternal, } ValueType; @@ -29,10 +30,58 @@ struct ExprLambda; struct PrimOp; struct PrimOp; class Symbol; +struct Pos; +class EvalState; +class XMLWriter; typedef long NixInt; +/* External values must descend from ExternalValueBase, so that + * type-agnostic nix functions (e.g. showType) can be implemented + */ +class ExternalValueBase +{ + friend std::ostream & operator << (std::ostream & str, ExternalValueBase & v); + protected: + /* Print out the value */ + virtual std::ostream & print(std::ostream & str) = 0; + + public: + /* Return a simple string describing the type */ + virtual string showType() = 0; + + /* Return a string to be used in builtins.typeOf */ + virtual string typeOf() = 0; + + /* How much space does this value take up */ + virtual size_t valueSize(std::set<const void *> & seen) = 0; + + /* Coerce the value to a string. Defaults to uncoercable, i.e. throws an + * error + */ + virtual string coerceToString(const Pos & pos, PathSet & context, bool copyMore, bool copyToStore); + + /* Compare to another value of the same type. Defaults to uncomparable, + * i.e. always false. + */ + virtual bool operator==(const ExternalValueBase & b); + + /* Print the value as JSON. Defaults to unconvertable, i.e. throws an error */ + virtual void printValueAsJSON(EvalState & state, bool strict, + std::ostream & str, PathSet & context); + + /* Print the value as XML. Defaults to unevaluated */ + virtual void printValueAsXML(EvalState & state, bool strict, bool location, + XMLWriter & doc, PathSet & context, PathSet & drvsSeen); + + virtual ~ExternalValueBase() + { + }; +}; + +std::ostream & operator << (std::ostream & str, ExternalValueBase & v); + struct Value { @@ -88,6 +137,7 @@ struct Value struct { Value * left, * right; } primOpApp; + ExternalValueBase * external; }; }; |