For a long time `nix repl` has supported displaying documentation set on builtins, however, it has long been convention to use Markdown comments on Nix functions themselves for documentation. This exposes that information to `nix repl` users in a nice and formatted way. NixOS/rfcs#145 doc-comments are primarily what this feature is intended to consume, however, support for lambda documentation in the repl is experimental. We do our best effort to support the RFC here. These changes are based on [the nix-doc library](https://github.com/lf-/nix-doc) and are licensed under the terms described in the relevant source files. Change-Id: Ic6fe947d39a22540705d890737e336c4720b0a22
40 lines
1.1 KiB
Rust
40 lines
1.1 KiB
Rust
// SPDX-FileCopyrightText: 2024 Jade Lovelace
|
|
//
|
|
// SPDX-License-Identifier: BSD-2-Clause OR MIT
|
|
|
|
use rnix::types::{Lambda, TypedNode};
|
|
use rnix::SyntaxKind::*;
|
|
|
|
/// Pretty-prints the arguments to a function
|
|
pub fn pprint_args(lambda: &Lambda) -> String {
|
|
// TODO: handle docs directly on NODE_IDENT args (uncommon case)
|
|
let mut lambda = lambda.clone();
|
|
let mut out = String::new();
|
|
loop {
|
|
let arg = lambda.arg().unwrap();
|
|
match arg.kind() {
|
|
NODE_IDENT => {
|
|
out += &format!("*{}*", &arg.to_string());
|
|
out.push_str(": ");
|
|
let body = lambda.body().unwrap();
|
|
if body.kind() == NODE_LAMBDA {
|
|
lambda = Lambda::cast(body).unwrap();
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
NODE_PATTERN => {
|
|
out += &format!("*{}*", &arg.to_string());
|
|
out.push_str(": ");
|
|
break;
|
|
}
|
|
t => {
|
|
unreachable!("unhandled arg type {:?}", t);
|
|
}
|
|
}
|
|
}
|
|
out.push_str("...");
|
|
out
|
|
|
|
//pprint_arg(lambda.arg());
|
|
}
|