A powerful string transformation CLI tool and Rust library that makes complex text processing simple. Transform data using intuitive template syntax β chain operations like split, join, replace, filter, and 20+ others in a single readable expression.
- π Why String Pipeline?
- β‘ Quick Examples
- π Installation
- π Quick Start
- π Documentation
- π§ͺ Testing
- π€ Contributing
- π License
Transform complex text processing into simple, readable templates:
# Traditional approach (multiple commands)
echo "john.doe@email.com,jane.smith@company.org" | \
tr ',' '\n' | \
grep -o '@[^,]*' | \
tr -d '@' | \
sort | \
tr '\n' ','
# String Pipeline (single template)
string-pipeline "{split:,:..|map:{regex_extract:@(.+):1}|sort}" "john.doe@email.com,jane.smith@company.org"
# Output: "company.org,email.com"
- π Chainable Operations: Pipe operations together naturally
- π― Precise Control: Python-like ranges with Rust syntax (
-2..
,1..=3
) - πΊοΈ Powerful Mapping: Apply sub-pipelines to each list item
- π Regex Support: sed-like patterns for complex transformations
- π Debug Mode: Step-by-step operation visualization
- β‘ Performance Tools: Comprehensive benchmarking and optimization
- π₯ Flexible I/O: CLI tool + embeddable Rust library
# Extract middle items from list
string-pipeline "{split:,:1..3}" "a,b,c,d,e"
# Output: "b,c"
# Clean and format names
string-pipeline '{split:,:..|map:{trim|upper|append:!}}' " john , jane , bob "
# Output: "JOHN!,JANE!,BOB!"
# Extract numbers and pad with zeros
string-pipeline '{split:,:..|map:{regex_extract:\d+|pad:3:0:left}}' "item1,thing22,stuff333"
# Output: "001,022,333"
# Filter files, format as list
string-pipeline '{split:,:..|filter:\.py$|sort|map:{prepend:β’ }|join:\n}' "app.py,readme.md,test.py,data.json"
# Output: "β’ app.py\nβ’ test.py"
# Extract domains from URLs
string-pipeline '{split:,:..|map:{regex_extract://([^/]+):1|upper}}' "https://github.com,https://google.com"
# Output: "GITHUB.COM,GOOGLE.COM"
# Debug complex processing
string-pipeline "{split: :..|filter:^[A-Z]|sort:desc}" "apple Banana cherry Date"
# Output: Date,Banana
π‘ Want to see more? Check out the π Documentation with 20+ operations and real-world examples!
# Install from crates.io
cargo install string_pipeline
# Or build from source
git clone https://github.com/lalvarezt/string_pipeline.git
cd string_pipeline
cargo install --path .
Add to your Cargo.toml
:
[dependencies]
string_pipeline = "0.12.0"
# With argument
string-pipeline '{template}' "input string"
# With stdin
echo "input" | string-pipeline '{template}'
# Debug mode (shows each step)
string-pipeline "{!split:,:..|map:{upper}}" "hello,world"
# DEBUG: π MULTI-TEMPLATE
# DEBUG: βββ π MULTI-TEMPLATE START
# DEBUG: βββ Template: "{!split:,:..|map:{upper}}"
# DEBUG: βββ β‘οΈ Input: "hello,world"
# DEBUG: βββ 1 sections to process (literal: 0, template: 1)
# DEBUG: β
# DEBUG: βββ π SECTION 1/1: [template: split(',',..) | map { operations: [upper] }]
# DEBUG: βββ πΎ CACHE MISS Computing and storing result
# DEBUG: β
# DEBUG: βββ π Main Pipeline
# DEBUG: β βββ π PIPELINE START: 2 operations
# DEBUG: β βββ β‘οΈ Input: String(hello,world)
# DEBUG: β βββ 1. Split(',')
# DEBUG: β βββ 2. Map(1)
# DEBUG: β βββ βοΈ Step 1: Split
# DEBUG: β β βββ β‘οΈ Input: String(hello,world)
# DEBUG: β β βββ π― Result: List["hello", "world"]
# DEBUG: β β βββ Time: 332.41Β΅s
# DEBUG: β βββ βοΈ Step 2: Map
# DEBUG: β β βββ β‘οΈ Input: List["hello", "world"]
# DEBUG: β β βββ π― Result: String(processing...)
# DEBUG: β β βββ Time: 0ns
# DEBUG: β β βββ ποΈ Item 1/2
# DEBUG: β β β βββ β‘οΈ Input: "hello"
# DEBUG: β β β βββ π Sub-Pipeline
# DEBUG: β β β β βββ π§ SUB-PIPELINE START: 1 operations
# DEBUG: β β β β βββ β‘οΈ Input: String(hello)
# DEBUG: β β β β βββ βοΈ Step 1: Upper
# DEBUG: β β β β β βββ β‘οΈ Input: String(hello)
# DEBUG: β β β β β βββ π― Result: String(HELLO)
# DEBUG: β β β β β βββ Time: 875ns
# DEBUG: β β β β βββ β
SUB-PIPELINE COMPLETE
# DEBUG: β β β β βββ π― Result: String(HELLO)
# DEBUG: β β β β βββ Time: 16.37Β΅s
# DEBUG: β β β βββ Output: "HELLO"
# DEBUG: β β βββ ποΈ Item 2/2
# DEBUG: β β β βββ β‘οΈ Input: "world"
# DEBUG: β β β βββ π Sub-Pipeline
# DEBUG: β β β β βββ π§ SUB-PIPELINE START: 1 operations
# DEBUG: β β β β βββ β‘οΈ Input: String(world)
# DEBUG: β β β β βββ βοΈ Step 1: Upper
# DEBUG: β β β β β βββ β‘οΈ Input: String(world)
# DEBUG: β β β β β βββ π― Result: String(WORLD)
# DEBUG: β β β β β βββ Time: 93ns
# DEBUG: β β β β βββ β
SUB-PIPELINE COMPLETE
# DEBUG: β β β β βββ π― Result: String(WORLD)
# DEBUG: β β β β βββ Time: 15.749Β΅s
# DEBUG: β β β βββ Output: "WORLD"
# DEBUG: β β βββ π¦ MAP COMPLETED: 2 β 2 items
# DEBUG: β βββ β
PIPELINE COMPLETE
# DEBUG: β βββ π― Result: List["HELLO", "WORLD"]
# DEBUG: β βββ Time: 457.193Β΅s
# DEBUG: β
# DEBUG: βββ π β
MULTI-TEMPLATE COMPLETE
# DEBUG: βββ π― Final result: "HELLO,WORLD"
# DEBUG: βββ Total execution time: 568.533Β΅s
# DEBUG: βββ Cache stats: 0 regex patterns, 1 split operations cached
# HELLO,WORLD
use string_pipeline::Template;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let template = Template::parse("{split:,:..|map:{upper}|join:-}")?;
let result = template.format("hello,world,rust")?;
println!("{}", result); // "HELLO-WORLD-RUST"
Ok(())
}
π― π Template System
π βοΈ CLI Options & Usage
π π Comprehensive Debug System Guide
β‘ π Performance Benchmarking Guide
Everything you need to master String Pipeline:
- ποΈ Template Syntax - Structure, chaining, escaping rules
- π Operations Reference - 20+ operations with examples
- πͺ Split & Join - Parse and reassemble text
- βοΈ Slice & Range - Extract with Python-like indices
- π¨ Transform - Case, trim, pad, append/prepend
- π Regex - Pattern matching and replacement
- ποΈ List Ops - Filter, sort, unique, reverse
- πΊοΈ Map - Apply operations to each item
- π― Range Specifications - Negative indexing, edge cases
- π‘οΈ Escaping Rules - When and how to escape characters
- π Debug Mode - Visual operation debugging
- π‘ Real-world Examples - Data processing, log analysis, formatting
β οΈ Troubleshooting - Common errors and best practices
# Run all tests
cargo test
# Run with output
cargo test -- --nocapture
# Run benchmarks
cargo bench
String Pipeline includes simple benchmarking tools for measuring performance:
# Build the benchmark tool
cargo build --release --bin bench
# Run benchmarks (1000 iterations)
./target/release/bench
# Quick performance check (100 iterations)
./target/release/bench --iterations 100
# Generate JSON for scripts
./target/release/bench --format json > benchmark_results.json
Performance Examples:
- Fast basic operations: 100-150ns (upper, lower, trim)
- List processing: 3-6ΞΌs (split, join, sort)
- Complex transformations: 10-60ΞΌs (map operations, regex)
- Release builds: 3-10x faster than debug builds
See the π Performance Benchmarking Guide for timing details and measurement tips.
We welcome contributions! π
- π Report bugs via GitHub Issues
- π‘ Suggest features or improvements
- π§ Submit pull requests
π Please see our comprehensive documentation for syntax details and examples.
This project is licensed under the MIT License. See LICENSE for details.
β‘ Fast, composable string transformations made simple!