Skip to main content

ParsedPipeline

Struct ParsedPipeline 

Source
pub struct ParsedPipeline {
    pub segments: Vec<ShellSegment>,
    pub operators: Vec<Operator>,
    pub structural_substitutions: Vec<SubstitutionSpan>,
    pub has_parse_errors: bool,
}
Expand description

A fully decomposed compound command.

This is a recursive structure: segments may contain substitutions, and each substitution contains a recursively-parsed ParsedPipeline. Evaluation proceeds bottom-up (a catamorphism): inner substitutions are evaluated first, their output feeds the outer command.

Fields§

§segments: Vec<ShellSegment>§operators: Vec<Operator>

Operators between consecutive segments.

§structural_substitutions: Vec<SubstitutionSpan>

Substitutions in non-command structural positions: for-loop iteration values (for i in $(cmd)), case subjects (case $(cmd) in).

These execute before any segment in this pipeline. Each is recursively parsed.

§has_parse_errors: bool

true when tree-sitter produced error-recovery nodes in the AST.

The pipeline is still usable — tree-sitter always produces a tree — but callers should treat the result as best-effort.

Implementations§

Source§

impl ParsedPipeline

Source

pub fn empty_with_error() -> Self

An empty pipeline representing a parse failure.

Source

pub fn find_pipeline<T>( &self, f: &impl Fn(&ParsedPipeline) -> Option<T>, ) -> Option<T>

Walk all pipelines in the tree (this one and all nested ones), depth-first. Returns the first Some(T) produced by f.

This is the lowest-level traversal primitive — it visits pipeline nodes rather than segments, enabling checks on pipeline-level properties (like has_parse_errors).

Source

pub fn any_pipeline(&self, f: &impl Fn(&ParsedPipeline) -> bool) -> bool

Returns true if any pipeline in the tree satisfies f.

Source

pub fn find_segment<T>( &self, f: &impl Fn(&ShellSegment) -> Option<T>, ) -> Option<T>

Walk the pipeline tree depth-first in execution order, applying f to each ShellSegment. Returns the first Some(T) produced by f, or None if every segment returns None.

Traversal order mirrors shell evaluation:

  1. Structural substitutions (for-loop values, case subjects)
  2. For each segment: its substitutions first, then the segment itself

This is the canonical way to inspect every command in the tree. Both “does any segment satisfy P?” and “find the first segment matching P” reduce to this.

Source

pub fn filter_segments<T>( &self, f: &impl Fn(&ShellSegment) -> Option<T>, ) -> Vec<T>

Walk the pipeline tree depth-first, applying f to each ShellSegment and collecting every non-None result.

Same traversal order as find_segment but does not short-circuit.

Source

pub fn has_parse_errors_recursive(&self) -> bool

Returns true if this pipeline or any nested substitution has parse errors.

When tree-sitter uses error recovery, some commands may not have been extracted. Callers enforcing a security boundary should treat a true return as “cannot safely analyze — fail closed.”

Trait Implementations§

Source§

impl Clone for ParsedPipeline

Source§

fn clone(&self) -> ParsedPipeline

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ParsedPipeline

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.