Make custom value type handling more consistent (#12230)

[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`
This commit is contained in:
Devyn Cairns
2024-03-19 03:09:59 -07:00
committed by GitHub
parent 931f522616
commit 6795ad7e33
19 changed files with 51 additions and 45 deletions

View File

@ -1138,7 +1138,7 @@ impl CustomValue for CantSerialize {
Value::custom_value(Box::new(self.clone()), span)
}
fn value_string(&self) -> String {
fn type_name(&self) -> String {
"CantSerialize".into()
}

View File

@ -55,7 +55,7 @@ impl CustomValue for PluginCustomValue {
Value::custom_value(Box::new(self.clone()), span)
}
fn value_string(&self) -> String {
fn type_name(&self) -> String {
self.name().to_owned()
}
@ -212,7 +212,7 @@ impl PluginCustomValue {
custom_value: &dyn CustomValue,
span: Span,
) -> Result<PluginCustomValue, ShellError> {
let name = custom_value.value_string();
let name = custom_value.type_name();
let notify_on_drop = custom_value.notify_plugin_on_drop();
bincode::serialize(custom_value)
.map(|data| PluginCustomValue::new(name, data, notify_on_drop, None))
@ -297,7 +297,7 @@ impl PluginCustomValue {
} else {
// Only PluginCustomValues can be sent
Err(ShellError::CustomValueIncorrectForPlugin {
name: val.value_string(),
name: val.type_name(),
span,
dest_plugin: source.name().to_owned(),
src_plugin: None,

View File

@ -19,7 +19,7 @@ fn serialize_deserialize() -> Result<(), ShellError> {
let original_value = TestCustomValue(32);
let span = Span::test_data();
let serialized = PluginCustomValue::serialize_from_custom_value(&original_value, span)?;
assert_eq!(original_value.value_string(), serialized.name());
assert_eq!(original_value.type_name(), serialized.name());
assert!(serialized.source.is_none());
let deserialized = serialized.deserialize_to_custom_value(span)?;
let downcasted = deserialized

View File

@ -14,7 +14,7 @@ impl CustomValue for TestCustomValue {
Value::custom_value(Box::new(self.clone()), span)
}
fn value_string(&self) -> String {
fn type_name(&self) -> String {
"TestCustomValue".into()
}