Skip to content

Commit c3d343a

Browse files
committed
docs: 0.8.2 version and docs improvement
1 parent 9e2c1c3 commit c3d343a

File tree

4 files changed

+26
-13
lines changed

4 files changed

+26
-13
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "parsm"
3-
version = "0.8.1"
3+
version = "0.8.2"
44
edition = "2024"
55
authors = ["John Cairns <john@2ad.com>"]
66
description = "Multi-format data processor that understands structured text better than sed or awk. Supports JSON, CSV, YAML, TOML, logfmt, and plain text with powerful filtering and templating."

src/bin/parsm.rs

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -520,44 +520,52 @@ fn print_usage_examples() {
520520
println!();
521521
println!(" # Filter and format output (combined):");
522522
println!(
523-
r#" echo '{{"name": "Alice", "age": 30}}' | parsm 'age > 25 {{${{name}} is ${{age}} years old}}'"#
523+
r#" echo '{{"name": "Alice", "age": 30}}' | parsm 'age > 25 [${{name}} is ${{age}} years old]'"#
524524
);
525525
println!();
526526
println!(" # Filter and format output (separate arguments):");
527527
println!(
528-
r#" echo '{{"name": "Alice", "age": 30}}' | parsm 'age > 25' '${{name}} is ${{age}} years old'"#
528+
r#" echo '{{"name": "Alice", "age": 30}}' | parsm 'age > 25' '[${{name}} is ${{age}} years old]'"#
529529
);
530530
println!();
531531
println!(" # Simple template variables:");
532-
println!(r#" echo '{{"name": "Alice", "age": 30}}' | parsm '$name is $age years old'"#);
532+
println!(r#" echo '{{"name": "Alice", "age": 30}}' | parsm '[$name is $age years old]'"#);
533533
println!();
534534
println!(" # Include original input with $0:");
535-
println!(r#" echo 'Alice,30' | parsm '${{0}} → ${{1}} is ${{2}}'"#);
535+
println!(r#" echo 'Alice,30' | parsm '[${{0}} → ${{field_0}} is ${{field_1}}]'"#);
536536
println!();
537537
println!(" # Filter CSV data (fields accessible as field_0, field_1, etc.):");
538538
println!(
539-
r#" echo 'Alice,30,Engineer' | parsm 'field_1 > "25" {{${{field_0}} - ${{field_2}}}}'"#
539+
r#" echo 'Alice,30,Engineer' | parsm 'field_1 > "25" [${{field_0}} - ${{field_2}}]'"#
540540
);
541541
println!();
542542
println!(" # Filter logfmt logs:");
543543
println!(
544-
r#" echo 'level=error msg="DB error" service=api' | parsm 'level == "error" {{[${{level}}] ${{msg}}}}'"#
544+
r#" echo 'level=error msg="DB error" service=api' | parsm 'level == "error" [[${{level}}] ${{msg}}]'"#
545545
);
546546
println!();
547+
println!(" # String operations:");
548+
println!(r#" echo '{{"name": "Alice"}}' | parsm 'name *= "lic"' # contains"#);
549+
println!(r#" echo '{{"name": "Alice"}}' | parsm 'name ^= "Al"' # starts with"#);
550+
println!(r#" echo '{{"name": "Alice"}}' | parsm 'name $= "ice"' # ends with"#);
551+
println!(r#" echo '{{"name": "Alice"}}' | parsm 'name ~= "A.*e"' # regex match"#);
552+
println!();
547553
println!(" # Complex conditions:");
548-
println!(r#" parsm 'name == "Alice" && age > 25 {{${{name}}: active}}'"#);
554+
println!(r#" parsm 'name == "Alice" && age > 25 [${{name}}: active]'"#);
549555
println!();
550556
println!(" # Just convert formats (no filter):");
551557
println!(" echo 'name: Alice' | parsm # YAML to JSON");
552558
println!();
553559
println!(" # Force specific format parsing:");
554-
println!(r#" echo 'Alice,30' | parsm --csv '${{1}} is ${{2}}'"#);
560+
println!(r#" echo 'Alice,30' | parsm --csv '[${{field_0}} is ${{field_1}}]'"#);
555561
println!(r#" echo 'level=error msg=timeout' | parsm --logfmt 'level == "error"'"#);
556562
println!(" echo 'name: Alice' | parsm --yaml 'name'");
557563
println!();
558564
println!("OPERATORS:");
559565
println!(" ==, !=, <, <=, >, >= # Comparison");
560-
println!(" contains, startswith, endswith # String operations");
566+
println!(
567+
" *=, ^=, $=, ~= # String operations (contains, starts with, ends with, regex)"
568+
);
561569
println!(" &&, ||, ! # Boolean logic");
562570
println!();
563571
println!("FIELD ACCESS:");
@@ -567,9 +575,14 @@ fn print_usage_examples() {
567575
println!(" field_0, field_1 # CSV columns");
568576
println!(" word_0, word_1 # Text words");
569577
println!();
578+
println!("TEMPLATE FORMATS:");
579+
println!(" [template content] # Bracket format (preferred)");
580+
println!(" {{template content}} # Brace format (alternative)");
581+
println!();
570582
println!("TEMPLATE VARIABLES:");
571583
println!(" ${{0}} # Entire original input");
572-
println!(" ${{1}}, ${{2}}, ${{3}} # Indexed fields (1-based, requires braces)");
584+
println!(" ${{field_0}}, ${{field_1}} # CSV columns (0-based)");
585+
println!(" ${{word_0}}, ${{word_1}} # Text words (0-based)");
573586
println!(" $name, ${{user.email}} # Named fields ($simple or ${{complex}})");
574587
println!(" $100 # Literal dollar amounts (invalid variable names)");
575588
println!();

src/dsl/fallback.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ pub fn try_fallback_parsing(input: &str) -> Result<ParsedDSL, Box<dyn std::error
3737

3838
// If all else fails, provide a helpful error
3939
Err(format!(
40-
"Could not parse '{input}'. Try:\n - Templates: [{{${{name}}}}], $name, or [Hello ${{name}}]\n - Filters: name == \"value\" or age > 25\n - Field selectors: name or \"field name\""
40+
"Could not parse '{input}'. Try:\n - Templates: [${{name}}], $name, or [Hello ${{name}}]\n - Filters: name == \"value\" or age > 25\n - Field selectors: name or \"field name\""
4141
).into())
4242
}
4343

0 commit comments

Comments
 (0)