mirror of
https://github.com/nushell/nushell.git
synced 2025-06-08 02:57:06 +02:00
# Description Before this PR, `to msgpack`/`to msgpackz` and `to json` serialize closures as `nil`/`null` respectively, when the `--serialize` option isn't passed. This PR makes it an error to serialize closures to msgpack or JSON without the `--serialize` flag, which is the behavior of `to nuon`. This PR also adds the `--serialize` flag to `to msgpack`. This PR also changes `to nuon` and `to json` to return an error if they cannot find the block contents of a closure, rather than serializing an empty string or an error string, respectively. This behavior is replicated for `to msgpack`. It also changes `to nuon`'s error message for serializing closures without `--serialize` to be the same as the new errors for `to json` and `to msgpack`. # User-Facing Changes * Add `--serialize` flag to `to msgpack`, similar to the `--serialize` flag for `to nuon` and `to json`. * Serializing closures to JSON or msgpack without `--serialize` Partially fixes #11738
36 lines
1.0 KiB
Rust
36 lines
1.0 KiB
Rust
use std::borrow::Cow;
|
|
|
|
use crate::{engine::EngineState, BlockId, ShellError, Span, Value, VarId};
|
|
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
|
pub struct Closure {
|
|
pub block_id: BlockId,
|
|
pub captures: Vec<(VarId, Value)>,
|
|
}
|
|
|
|
impl Closure {
|
|
pub fn coerce_into_string<'a>(
|
|
&self,
|
|
engine_state: &'a EngineState,
|
|
span: Span,
|
|
) -> Result<Cow<'a, str>, ShellError> {
|
|
let block = engine_state.get_block(self.block_id);
|
|
if let Some(span) = block.span {
|
|
let contents_bytes = engine_state.get_span_contents(span);
|
|
Ok(String::from_utf8_lossy(contents_bytes))
|
|
} else {
|
|
Err(ShellError::CantConvert {
|
|
to_type: "string".into(),
|
|
from_type: "closure".into(),
|
|
span,
|
|
help: Some(format!(
|
|
"unable to retrieve block contents for closure with id {}",
|
|
self.block_id.get()
|
|
)),
|
|
})
|
|
}
|
|
}
|
|
}
|