mirror of
https://github.com/nushell/nushell.git
synced 2025-07-14 13:25:47 +02:00
[Context on Discord](https://discord.com/channels/601130461678272522/855947301380947968/1219425984990806207) # Description - Rename `CustomValue::value_string()` to `type_name()` to reflect its usage better. - Change print behavior to always call `to_base_value()` first, to give the custom value better control over the output. - Change `describe --detailed` to show the type name as the subtype, rather than trying to describe the base value. - Change custom `Type` to use `type_name()` rather than `typetag_name()` to make things like `PluginCustomValue` more transparent One question: should `describe --detailed` still include a description of the base value somewhere? I'm torn on it, it seems possibly useful for some things (maybe sqlite databases?), but having `describe -d` not include the custom type name anywhere felt weird. Another option would be to add another method to `CustomValue` for info to be displayed in `describe`, so that it can be more type-specific? # User-Facing Changes Everything above has implications for printing and `describe` on custom values # Tests + Formatting - 🟢 `toolkit fmt` - 🟢 `toolkit clippy` - 🟢 `toolkit test` - 🟢 `toolkit test stdlib`
44 lines
1.2 KiB
Rust
44 lines
1.2 KiB
Rust
use nu_protocol::{CustomValue, ShellError, Span, Value};
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
use crate::plugin::PluginSource;
|
|
|
|
use super::PluginCustomValue;
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
|
pub(crate) struct TestCustomValue(pub i32);
|
|
|
|
#[typetag::serde]
|
|
impl CustomValue for TestCustomValue {
|
|
fn clone_value(&self, span: Span) -> Value {
|
|
Value::custom_value(Box::new(self.clone()), span)
|
|
}
|
|
|
|
fn type_name(&self) -> String {
|
|
"TestCustomValue".into()
|
|
}
|
|
|
|
fn to_base_value(&self, span: Span) -> Result<Value, ShellError> {
|
|
Ok(Value::int(self.0 as i64, span))
|
|
}
|
|
|
|
fn as_any(&self) -> &dyn std::any::Any {
|
|
self
|
|
}
|
|
}
|
|
|
|
pub(crate) fn test_plugin_custom_value() -> PluginCustomValue {
|
|
let data = bincode::serialize(&expected_test_custom_value() as &dyn CustomValue)
|
|
.expect("bincode serialization of the expected_test_custom_value() failed");
|
|
|
|
PluginCustomValue::new("TestCustomValue".into(), data, false, None)
|
|
}
|
|
|
|
pub(crate) fn expected_test_custom_value() -> TestCustomValue {
|
|
TestCustomValue(-1)
|
|
}
|
|
|
|
pub(crate) fn test_plugin_custom_value_with_source() -> PluginCustomValue {
|
|
test_plugin_custom_value().with_source(Some(PluginSource::new_fake("test").into()))
|
|
}
|