Declare input and output types of commands (#6796)

* Add failing test that list of ints and floats is List<Number>

* Start defining subtype relation

* Make it possible to declare input and output types for commands

- Enforce them in tests

* Declare input and output types of commands

* Add formatted signatures to `help commands` table

* Revert SyntaxShape::Table -> Type::Table change

* Revert unnecessary derive(Hash) on SyntaxShape

Co-authored-by: JT <547158+jntrnr@users.noreply.github.com>
This commit is contained in:
Dan Davison
2022-11-09 16:55:05 -05:00
committed by GitHub
parent f878276de7
commit df94052180
238 changed files with 2315 additions and 756 deletions

View File

@ -2,9 +2,9 @@ use nu_engine::{eval_expression, CallExt};
use nu_parser::parse_expression;
use nu_protocol::ast::{Call, PathMember};
use nu_protocol::engine::{Command, EngineState, Stack, StateWorkingSet};
use nu_protocol::Type;
use nu_protocol::{
Category, Example, ListStream, PipelineData, ShellError, Signature, Span, SyntaxShape, Value,
Category, Example, ListStream, PipelineData, ShellError, Signature, Span, SyntaxShape, Type,
Value,
};
#[derive(Clone)]
@ -17,6 +17,10 @@ impl Command for Format {
fn signature(&self) -> Signature {
Signature::build("format")
.input_output_types(vec![(
Type::Table(vec![]),
Type::List(Box::new(Type::String)),
)])
.required(
"pattern",
SyntaxShape::String,

View File

@ -4,7 +4,7 @@ use nu_protocol::ast::{Call, CellPath};
use nu_protocol::engine::{Command, EngineState, Stack};
use nu_protocol::{
format_filesize, Category, Example, PipelineData, ShellError, Signature, Span, SyntaxShape,
Value,
Type, Value,
};
struct Arguments {
@ -28,6 +28,7 @@ impl Command for FileSize {
fn signature(&self) -> Signature {
Signature::build("format filesize")
.input_output_types(vec![(Type::Filesize, Type::String)])
.required(
"format value",
SyntaxShape::String,
@ -36,7 +37,7 @@ impl Command for FileSize {
.rest(
"rest",
SyntaxShape::CellPath,
"optinally find and replace text by column paths",
"Optionally find and replace text by column paths",
)
.category(Category::Strings)
}
@ -78,19 +79,19 @@ impl Command for FileSize {
fn examples(&self) -> Vec<Example> {
vec![
Example {
description: "Convert the size row to KB",
description: "Convert the size column to KB",
example: "ls | format filesize KB size",
result: None,
},
Example {
description: "Convert the apparent row to B",
description: "Convert the apparent column to B",
example: "du | format filesize B apparent",
result: None,
},
Example {
description: "Convert the size data to MB",
example: "4Gb | format filesize MB",
result: None,
result: Some(Value::test_string("4000.0 MB")),
},
]
}