haematite-cli 0.21.1

The haematite command: serve a store, its door and Studio, answer MCP, query with jq, and host the store's assistant seat
Documentation
use super::Span;

/// A refused stage ends at its outer pipe, not a pipe inside its arguments.
pub(super) fn stage(rest: &str, start: usize) -> Span {
    let mut quote = None;
    let mut escaped = false;
    let mut depth = 0_usize;
    let mut end = rest.len();
    for (offset, character) in rest.char_indices() {
        if let Some(delimiter) = quote {
            if escaped {
                escaped = false;
            } else if character == '\\' && delimiter == '"' {
                escaped = true;
            } else if character == delimiter {
                quote = None;
            }
            continue;
        }
        match character {
            '\'' | '"' => quote = Some(character),
            '(' | '[' | '{' => depth += 1,
            ')' | ']' | '}' => depth = depth.saturating_sub(1),
            '|' if depth == 0 => {
                end = offset;
                break;
            }
            _ => {}
        }
    }
    Span {
        start,
        end: start + rest.split_at(end).0.trim_end().len(),
    }
}