#[non_exhaustive]pub struct ExecResult {
pub code: i64,
pub err: String,
pub data: Option<Value>,
pub did_spill: bool,
pub original_code: Option<i64>,
pub content_type: Option<String>,
pub baggage: BTreeMap<String, String>,
/* private fields */
}Expand description
The result of executing a command or pipeline.
$? in script syntax is the POSIX exit code (an integer). To read the
previous command’s structured .data (or its captured stdout) from
inside a script, use the kaish-last builtin and pipe / capture its
output. Inside Rust callers, read .data, .text_out(), etc. directly.
Notes on the fields:
code— exit code (0 = success)err— error message if failedout— raw stdout as stringdata— structured data; only set by builtins/tools that opt in (e.g.seq,jq,cut,find,glob,split). External commands never populate this — pipe their stdout throughjqto get it.
Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.code: i64Exit code. 0 means success.
err: StringRaw standard error as a string.
data: Option<Value>Structured data — only populated when a builtin/tool sets it explicitly.
Stdout is never sniffed; this stays None for external commands.
did_spill: boolTrue if the output limiter capped this result. Either the overflow was
written to a disk spill file (the out message carries the path) or it
was truncated in memory (Memory spill mode — head+tail only, no
recoverable file). Both cases remap the exit code to 3.
original_code: Option<i64>The command’s original exit code before spill logic overwrote it with 2 or 3.
Present only when did_spill is true and code was changed.
content_type: Option<String>MIME content type hint (e.g., “text/markdown”, “image/svg+xml”). When set, downstream consumers can use this instead of sniffing content.
baggage: BTreeMap<String, String>Opaque key-value context propagated from tools through execution. Intermediaries (kaish) carry but don’t interpret. Consumers read known keys. Follows W3C Baggage semantics — useful for OTel trace propagation, application-level hints, etc.
Implementations§
Source§impl ExecResult
impl ExecResult
Sourcepub fn success(out: impl Into<String>) -> ExecResult
pub fn success(out: impl Into<String>) -> ExecResult
Create a successful result with output.
Sourcepub fn with_output(output: OutputData) -> ExecResult
pub fn with_output(output: OutputData) -> ExecResult
Create a successful result with structured output data.
The OutputData is the source of truth. Text is materialized lazily
via text_out() when needed (pipes, redirects, command substitution).
Sourcepub fn success_data(data: Value) -> ExecResult
pub fn success_data(data: Value) -> ExecResult
Create a successful result with structured data.
Sourcepub fn success_with_data(out: impl Into<String>, data: Value) -> ExecResult
pub fn success_with_data(out: impl Into<String>, data: Value) -> ExecResult
Create a successful result with both text output and structured data.
Use this when a command should have:
- Text output for pipes and traditional shell usage
- Structured data for iteration and programmatic access
The data field takes precedence for command substitution in contexts
like for i in $(cmd) where the structured data can be iterated.
Sourcepub fn failure(code: i64, err: impl Into<String>) -> ExecResult
pub fn failure(code: i64, err: impl Into<String>) -> ExecResult
Create a failed result with an error message.
Sourcepub fn from_output(
code: i64,
stdout: impl Into<String>,
stderr: impl Into<String>,
) -> ExecResult
pub fn from_output( code: i64, stdout: impl Into<String>, stderr: impl Into<String>, ) -> ExecResult
Create a result from raw output streams.
data is left empty — kaish does not sniff stdout for JSON. To get
structured iteration from an external command, pipe through jq:
for i in $(curl ... | jq .); do ....
Sourcepub fn with_output_and_text(
output: OutputData,
text: impl Into<String>,
) -> ExecResult
pub fn with_output_and_text( output: OutputData, text: impl Into<String>, ) -> ExecResult
Create a successful result with structured output and explicit pipe text.
Use this when a builtin needs custom text formatting that differs from
the canonical OutputData::to_canonical_string() representation.
Sourcepub fn from_parts(
code: i64,
out: String,
err: String,
data: Option<Value>,
) -> ExecResult
pub fn from_parts( code: i64, out: String, err: String, data: Option<Value>, ) -> ExecResult
Create a result from parts — for kernel struct literal sites.
Sourcepub fn with_code(self, code: i64) -> ExecResult
pub fn with_code(self, code: i64) -> ExecResult
Builder: set the exit code, returning self for chaining.
Sourcepub fn text_out(&self) -> Cow<'_, str>
pub fn text_out(&self) -> Cow<'_, str>
Get text output, materializing from OutputData on demand.
Returns self.out if non-empty, otherwise falls back to
OutputData::to_canonical_string(). This is the canonical way to
get text for pipes, command substitution, and file redirects.
Sourcepub fn output(&self) -> Option<&OutputData>
pub fn output(&self) -> Option<&OutputData>
Get a reference to structured output data.
Sourcepub fn has_output(&self) -> bool
pub fn has_output(&self) -> bool
True if structured output data is present.
Sourcepub fn set_output(&mut self, o: Option<OutputData>)
pub fn set_output(&mut self, o: Option<OutputData>)
Replace .output.
Sourcepub fn take_output(&mut self) -> Option<OutputData>
pub fn take_output(&mut self) -> Option<OutputData>
Take .output, leaving None.
Sourcepub fn materialize(&mut self)
pub fn materialize(&mut self)
Materialize: if .out is empty and .output is present,
populate .out from canonical string and clear .output.
Sourcepub fn take_output_for_stream(&mut self) -> Option<OutputData>
pub fn take_output_for_stream(&mut self) -> Option<OutputData>
Take .output only if .out is empty (no custom text),
so caller can stream directly without materializing.
Sourcepub fn with_content_type(self, ct: impl Into<String>) -> ExecResult
pub fn with_content_type(self, ct: impl Into<String>) -> ExecResult
Set content type hint, returning self for chaining.
Trait Implementations§
Source§impl Clone for ExecResult
impl Clone for ExecResult
Source§fn clone(&self) -> ExecResult
fn clone(&self) -> ExecResult
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ExecResult
impl Debug for ExecResult
Source§impl Default for ExecResult
impl Default for ExecResult
Source§fn default() -> ExecResult
fn default() -> ExecResult
Source§impl<'de> Deserialize<'de> for ExecResult
impl<'de> Deserialize<'de> for ExecResult
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<ExecResult, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<ExecResult, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
Source§impl From<ExecResult> for ToolResult
impl From<ExecResult> for ToolResult
Source§fn from(exec: ExecResult) -> ToolResult
fn from(exec: ExecResult) -> ToolResult
Source§impl From<ExecResult> for ControlFlow
impl From<ExecResult> for ControlFlow
Source§fn from(result: ExecResult) -> Self
fn from(result: ExecResult) -> Self
Source§impl PartialEq for ExecResult
impl PartialEq for ExecResult
Source§fn eq(&self, other: &ExecResult) -> bool
fn eq(&self, other: &ExecResult) -> bool
self and other values to be equal, and is used by ==.