diff --git a/modules/jc/README.md b/modules/jc/README.md new file mode 100644 index 0000000..a26c442 --- /dev/null +++ b/modules/jc/README.md @@ -0,0 +1,34 @@ +# jc (JSON converter) + +jc converts the output of many commands, file-types, and strings to JSON or YAML + +This module provides a wrapper around the `jc` command line tool and +automatically parses its output into a structured data format. + +## Example + +```nu +> df | jc --df + +┌─#─┬───filesystem───┬─1k_blocks─┬───used────┬─available─┬─────────mounted_on─────────┬─use_percent─┬─capacity_percent─┐ +│ 0 │ /dev/disk3s1s1 │ 482797652 │ 368026060 │ 114771592 │ / │ 77 │ 24 │ +│ 1 │ /dev/disk3s6 │ 482797652 │ 368026060 │ 114771592 │ /System/Volumes/VM │ 77 │ 24 │ +│ 2 │ /dev/disk3s2 │ 482797652 │ 368026060 │ 114771592 │ /System/Volumes/Preboot │ 77 │ 24 │ +│ 3 │ /dev/disk3s4 │ 482797652 │ 368026060 │ 114771592 │ /System/Volumes/Update │ 77 │ 24 │ +│ 4 │ /dev/disk1s2 │ 512000 │ 23052 │ 488948 │ /System/Volumes/xarts │ 5 │ 96 │ +│ 5 │ /dev/disk1s1 │ 512000 │ 23052 │ 488948 │ /System/Volumes/iSCPreboot │ 5 │ 96 │ +│ 6 │ /dev/disk1s3 │ 512000 │ 23052 │ 488948 │ /System/Volumes/Hardware │ 5 │ 96 │ +│ 7 │ /dev/disk3s7 │ 482797652 │ 368026060 │ 114771592 │ /nix │ 77 │ 24 │ +│ 8 │ /dev/disk4 │ 524288 │ 12316 │ 511972 │ /private/var/run/agenix.d │ 3 │ 98 │ +└───┴────────────────┴───────────┴───────────┴───────────┴────────────────────────────┴─────────────┴──────────────────┘ +``` + +## Installation + +1. Install the `jc` command line: + + +2. Source this module in your `config.nu`: + ```nu + source ~/path/to/jc/mod.rs + ``` diff --git a/modules/jc/mod.nu b/modules/jc/mod.nu index f83e522..5a78f13 100644 --- a/modules/jc/mod.nu +++ b/modules/jc/mod.nu @@ -1,28 +1,56 @@ -# Run `jc` (Json Converter) -# -# This module provides a wrapper around the `jc` command line tool and automatically -# parses its output into a structured data format. -# -# Dependencies: -# * `jc` -# -# Installation: -# 1. Install the `jc` command line: https://kellyjonbrazil.github.io/jc/#installation -# 2. Import this module in your `config.nu`: `import ~/.local/share/nu_scripts/modules/jc/` -export def --wrapped main [...args]: [any -> table, any -> record, any -> string] { - let run = (^jc ...$args | complete) +def --env "nu-complete jc" [] { + if $env.__NU_COMPLETE_JC? != null { + return $env.__NU_COMPLETE_JC + } + + let options = try { + let options = ^jc --help + | collect + | parse "{_}Parsers:\n{_}\n\nOptions:\n{inherent}\n\nSlice:{_}" + | get 0 + + let parsers = ^jc --about + | from json + | get parsers + | select argument description + | rename value description + + let inherent = $options.inherent + | lines + | parse " {short}, {long} {description}" + | update description { str trim } + | each {|record| + [[value, description]; + [$record.short, $record.description], + [$record.long, $record.description]] + } + | flatten + + $parsers ++ $inherent + } catch { + [] + } + + $env.__NU_COMPLETE_JC = $options + + $options +} + +# Run `jc` (JSON Converter). +export def --wrapped jc [...arguments: string@"nu-complete jc"]: [any -> table, any -> record, any -> string] { + let run = ^jc ...$arguments | complete if $run.exit_code != 0 { error make { - msg: $run.stderr, + msg: "jc exection failed" label: { - text: "jc execution failed", - span: (metadata $args).span + text: ($run.stderr | str replace "jc:" "" | str replace "Error -" "" | str trim) + span: (metadata $arguments).span } } } - if '--help' in $args or '-h' in $args { + if "--help" in $arguments or "-h" in $arguments { $run.stdout } else { $run.stdout | from json