2023-04-09 20:42:20 +00:00
|
|
|
#pragma once
|
|
|
|
/**
|
|
|
|
* @file
|
|
|
|
* @brief Common printing functions for the Nix language
|
|
|
|
*
|
|
|
|
* While most types come with their own methods for printing, they share some
|
|
|
|
* functions that are placed here.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <iostream>
|
|
|
|
|
Unify and refactor value printing
Previously, there were two mostly-identical value printers -- one in
`libexpr/eval.cc` (which didn't force values) and one in
`libcmd/repl.cc` (which did force values and also printed ANSI color
codes).
This PR unifies both of these printers into `print.cc` and provides a
`PrintOptions` struct for controlling the output, which allows for
toggling whether values are forced, whether repeated values are tracked,
and whether ANSI color codes are displayed.
Additionally, `PrintOptions` allows tuning the maximum number of
attributes, list items, and bytes in a string that will be displayed;
this makes it ideal for contexts where printing too much output (e.g.
all of Nixpkgs) is distracting. (As requested by @roberth in
https://github.com/NixOS/nix/pull/9554#issuecomment-1845095735)
Please read the tests for example output.
Future work:
- It would be nice to provide this function as a builtin, perhaps
`builtins.toStringDebug` -- a printing function that never fails would
be useful when debugging Nix code.
- It would be nice to support customizing `PrintOptions` members on the
command line, e.g. `--option to-string-max-attrs 1000`.
(cherry picked from commit 0fa08b451682fb3311fe58112ff05c4fe5bee3a4, )
===
Restore ambiguous value printer for `nix-instantiate`
The Nix team has requested that this output format remain unchanged.
I've added a warning to the man page explaining that `nix-instantiate
--eval` output will not parse correctly in many situations.
(cherry picked from commit df84dd4d8dd3fd6381ac2ca3064432ab31a16b79)
Change-Id: I7cca6b4b53cd0642f2d49af657d5676a8554c9f8
2024-03-08 02:05:47 +00:00
|
|
|
#include "print-options.hh"
|
|
|
|
|
2023-04-09 20:42:20 +00:00
|
|
|
namespace nix {
|
2024-03-08 01:21:26 +00:00
|
|
|
|
2024-03-08 03:49:08 +00:00
|
|
|
class EvalState;
|
|
|
|
struct Value;
|
|
|
|
|
2024-03-08 01:21:26 +00:00
|
|
|
/**
|
|
|
|
* Print a string as a Nix string literal.
|
|
|
|
*
|
|
|
|
* Quotes and fairly minimal escaping are added.
|
|
|
|
*
|
Unify and refactor value printing
Previously, there were two mostly-identical value printers -- one in
`libexpr/eval.cc` (which didn't force values) and one in
`libcmd/repl.cc` (which did force values and also printed ANSI color
codes).
This PR unifies both of these printers into `print.cc` and provides a
`PrintOptions` struct for controlling the output, which allows for
toggling whether values are forced, whether repeated values are tracked,
and whether ANSI color codes are displayed.
Additionally, `PrintOptions` allows tuning the maximum number of
attributes, list items, and bytes in a string that will be displayed;
this makes it ideal for contexts where printing too much output (e.g.
all of Nixpkgs) is distracting. (As requested by @roberth in
https://github.com/NixOS/nix/pull/9554#issuecomment-1845095735)
Please read the tests for example output.
Future work:
- It would be nice to provide this function as a builtin, perhaps
`builtins.toStringDebug` -- a printing function that never fails would
be useful when debugging Nix code.
- It would be nice to support customizing `PrintOptions` members on the
command line, e.g. `--option to-string-max-attrs 1000`.
(cherry picked from commit 0fa08b451682fb3311fe58112ff05c4fe5bee3a4, )
===
Restore ambiguous value printer for `nix-instantiate`
The Nix team has requested that this output format remain unchanged.
I've added a warning to the man page explaining that `nix-instantiate
--eval` output will not parse correctly in many situations.
(cherry picked from commit df84dd4d8dd3fd6381ac2ca3064432ab31a16b79)
Change-Id: I7cca6b4b53cd0642f2d49af657d5676a8554c9f8
2024-03-08 02:05:47 +00:00
|
|
|
* @param o The output stream to print to
|
2024-03-08 01:21:26 +00:00
|
|
|
* @param s The logical string
|
|
|
|
*/
|
|
|
|
std::ostream & printLiteralString(std::ostream & o, std::string_view s);
|
|
|
|
inline std::ostream & printLiteralString(std::ostream & o, const char * s) {
|
|
|
|
return printLiteralString(o, std::string_view(s));
|
|
|
|
}
|
|
|
|
inline std::ostream & printLiteralString(std::ostream & o, const std::string & s) {
|
|
|
|
return printLiteralString(o, std::string_view(s));
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Print `true` or `false`. */
|
|
|
|
std::ostream & printLiteralBool(std::ostream & o, bool b);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Print a string as an attribute name in the Nix expression language syntax.
|
|
|
|
*
|
|
|
|
* Prints a quoted string if necessary.
|
|
|
|
*/
|
|
|
|
std::ostream & printAttributeName(std::ostream & o, std::string_view s);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns `true' is a string is a reserved keyword which requires quotation
|
|
|
|
* when printing attribute set field names.
|
|
|
|
*/
|
|
|
|
bool isReservedKeyword(const std::string_view str);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Print a string as an identifier in the Nix expression language syntax.
|
|
|
|
*
|
|
|
|
* FIXME: "identifier" is ambiguous. Identifiers do not have a single
|
|
|
|
* textual representation. They can be used in variable references,
|
|
|
|
* let bindings, left-hand sides or attribute names in a select
|
|
|
|
* expression, or something else entirely, like JSON. Use one of the
|
|
|
|
* `print*` functions instead.
|
|
|
|
*/
|
|
|
|
std::ostream & printIdentifier(std::ostream & o, std::string_view s);
|
|
|
|
|
Unify and refactor value printing
Previously, there were two mostly-identical value printers -- one in
`libexpr/eval.cc` (which didn't force values) and one in
`libcmd/repl.cc` (which did force values and also printed ANSI color
codes).
This PR unifies both of these printers into `print.cc` and provides a
`PrintOptions` struct for controlling the output, which allows for
toggling whether values are forced, whether repeated values are tracked,
and whether ANSI color codes are displayed.
Additionally, `PrintOptions` allows tuning the maximum number of
attributes, list items, and bytes in a string that will be displayed;
this makes it ideal for contexts where printing too much output (e.g.
all of Nixpkgs) is distracting. (As requested by @roberth in
https://github.com/NixOS/nix/pull/9554#issuecomment-1845095735)
Please read the tests for example output.
Future work:
- It would be nice to provide this function as a builtin, perhaps
`builtins.toStringDebug` -- a printing function that never fails would
be useful when debugging Nix code.
- It would be nice to support customizing `PrintOptions` members on the
command line, e.g. `--option to-string-max-attrs 1000`.
(cherry picked from commit 0fa08b451682fb3311fe58112ff05c4fe5bee3a4, )
===
Restore ambiguous value printer for `nix-instantiate`
The Nix team has requested that this output format remain unchanged.
I've added a warning to the man page explaining that `nix-instantiate
--eval` output will not parse correctly in many situations.
(cherry picked from commit df84dd4d8dd3fd6381ac2ca3064432ab31a16b79)
Change-Id: I7cca6b4b53cd0642f2d49af657d5676a8554c9f8
2024-03-08 02:05:47 +00:00
|
|
|
void printValue(EvalState & state, std::ostream & str, Value & v, PrintOptions options = PrintOptions {});
|
|
|
|
|
2024-03-08 03:49:08 +00:00
|
|
|
/**
|
|
|
|
* A partially-applied form of `printValue` which can be formatted using `<<`
|
|
|
|
* without allocating an intermediate string.
|
|
|
|
*/
|
|
|
|
class ValuePrinter {
|
|
|
|
friend std::ostream & operator << (std::ostream & output, const ValuePrinter & printer);
|
|
|
|
private:
|
|
|
|
EvalState & state;
|
|
|
|
Value & value;
|
|
|
|
PrintOptions options;
|
|
|
|
|
|
|
|
public:
|
|
|
|
ValuePrinter(EvalState & state, Value & value, PrintOptions options = PrintOptions {})
|
|
|
|
: state(state), value(value), options(options) { }
|
|
|
|
};
|
|
|
|
|
|
|
|
std::ostream & operator<<(std::ostream & output, const ValuePrinter & printer);
|
2023-04-09 20:42:20 +00:00
|
|
|
}
|