# convert json log entries into an array of nu log entries export def `from json-lines` [] { lines | each {|it| try { $it | from json } catch { {msg: $it} }} } export def `follow json-lines` [] { lines | each {|it| try { $it | from json } catch { {msg: $it} } | table --expand | print} | ignore } export def `follow nuon-lines` [] { lines | each {|it| try { $it | from nuon } catch { {msg: $it} } | table --expand | print} | ignore } export def `diff-all` [...files] { if ($files | length) < 2 { error make { msg: "you have to provide at least two files"} } let diffs = $files | window 2 mut index = 0 loop { difft --context 100 ...($diffs | get $index) match (input -n 1) { "n" => { $index = $index + 1 }, "p" => { $index = $index - 1 }, "q" => { break } } if $index > ($diffs | length) - 1 { $index -= 1; } else if $index < 0 { $index = 0 } } } def --wrapped with-flag [...flag] { if ($in | is-empty) { [] } else { [...$flag $in] } } def --wrapped with-switch [...flag] { if ($in) { [...$flag] } else { [] } } def --wrapped with-name [...name] { if not $in or ($in | is-empty) { [] } else { [...$name]} } # returns the word count of the given file export def wc [ --bytes (-c) # print the byte counts --lines (-l) # count lines instead of words --chars (-m) # print the character counts --max-line-length (-L) # print the maximum display length --words (-w) # print the word counts ...files ] { let c = $bytes | with-switch -c let l = $lines | with-switch -l let m = $chars | with-switch -m let L = $max_line_length | with-switch -L let w = $words | with-switch -w ( ^wc ...([$c $l $m $L $w] | flatten) ...$files | detect columns --no-headers | rename ...([ ($bytes | with-name "bytes") ($lines | with-name "lines") ($chars | with-name "chars") ($max_line_length | with-name "max_line_length") ($words | with-name "words") file ] | flatten ) ) } export def --wrapped df [...$args] { if (["--help", "--version"] | any {|it| $it in $args }) { ^df ...$args } else { ^df ...$args | detect columns --guess } } export def --env dotenv [file=".env"] { if not ($file | path exists) { err make { msg: $"env file ($file) not found "} } ( open $file | lines | where $it !~ "^\\s*#.*" | each {|line| try { $line | parse "{key}=\"{value}\"" | first | { $in.key: ($"\"($in.value)\"" | from nuon) } } catch { try { $line | parse "{key}={value}" | first | { $in.key: $in.value } } catch { null } } } | where $it != null | reduce --fold {} {|it, acc| $acc | merge $it } | load-env $in ) } export def brute-force [ closure: closure, # closure to execute --delay(-d): duration = 1sec, # delay between trys --max-trys: number # maximum number of trys. Default unlimited --print-errors, # print errors to stderr ] { mut count = 0; loop { $count += 1 let iteration = $count try { return (do -c $closure) } catch {|e| if $print_errors { print -e $e.msg } if $max_trys != null and $iteration >= $max_trys { error make $e } sleep $delay } } }