A string transformation library and CLI tool for Rust. Chain operations like split, join, replace, and filter using template syntax.
- π Why String Pipeline?
- β‘ Examples
- π Installation
- π Quick Start
- π§ͺ Testing
- β‘ Performance & Benchmarking
- π Documentation
- π€ 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
- πΊοΈ Powerful Mapping: Apply sub-pipelines to each list item
- π Regex Support: sed-like patterns for complex transformations
- π Debug Mode: Step-by-step operation visualization
# 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
# 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 string-pipeline --debug "{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(()) }
# 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
π Template System βοΈ CLI Options & Usage π Comprehensive Debug System Guide π Performance Benchmarking Guide
We welcome contributions! π
- π Report bugs via GitHub Issues
- π‘ Suggest features or improvements
- π§ Submit pull requests
This project is licensed under the MIT License. See LICENSE for details.
β‘ Fast and composable string transformations made simple!