diff --git a/filters.nu b/filters.nu index 175caaf..d312921 100755 --- a/filters.nu +++ b/filters.nu @@ -1,16 +1,31 @@ #!/usr/bin/env -S nu --stdin export def "parse filter" [ -] { - $in | parse --regex '^(?[^=]+)=(?.*)' | first | - update params { parse --regex `(?[^=]+)=(?[^:]+):?` } +]: string -> table> { + $in | parse --regex '^(?[^=]+)=(?.*)' | first | update params { + parse --regex `(?[^=]+)=(?[^:]+):?` + } } -export def "filter to-string" [] { - each { |filter| $'($filter.name)=($filter.params | format '{param}={value}')' } | - str join ':' +export def "filter to-string" [ +]: table> -> string { + each { + $'($in.name)=($in.params | format '{param}={value}')' + } | str join ':' } +# Build a record representaion of a complex filter +export def complex-filter [ + name: string + params: record = {} +]: nothing -> record> { + { + name: $name + params: ($params | transpose param value | compact param value) + } +} + + export def "complex-filters to-string" [ --pretty-print (-p) ]: table, filters: table>, output: string> -> string { @@ -20,3 +35,22 @@ export def "complex-filters to-string" [ str join '][' } | format '[{input}]{filters}[{output}]' | str join (";" + (if $pretty_print { "\n" } else { "" })) | str replace --all '[]' '' } + +# ============= +# Begin Filters +# ============= + +# loop video frames +export def loop [ + loop: int # Set the number of loops. Setting this value to -1 will result in infinite loops. Default is 0. + size: int # Set maximal size in number of frames. Default is 0. + --start (-s): int # Set first frame of loop. Default is 0. + --time (-t): float # Set the time of loop start in seconds. Only used if option named start is set to -1. +] { + complex-filter loop { + loop: $loop + size: $size + start: (if ($time | is-empty) { $start } else { -1 }) + time: $time + } +} diff --git a/filters_test.nu b/filters_test.nu new file mode 100644 index 0000000..34346cd --- /dev/null +++ b/filters_test.nu @@ -0,0 +1,25 @@ +#!/usr/bin/env nu + +use std [assert]; + +use ./filters.nu [complex-filter loop "parse filter"]; + +#[test] +def loop_has_defaults [] { + let got = (loop 10 1); + let want = (complex-filter 'loop' { loop: 10 size: 1 }); + assert equal $got $want; +} + +#[test] +def setting_time_sets_start_to-1 [] { + let got = (loop 10 1 -t 0.5); + let want = (complex-filter 'loop' { + loop: 10 + size: 1 + start: -1 + time: 0.5 + }); + + assert equal $got $want; +}