# Apply $filter to input
# <- downloads.json | evaluate_filter("plugins")
# -> [["internal", "plugins/Extras.jar", "type"], "zip"]
# -> [["internal", "plugins/Extras.jar", "url"], "..."]
# -> [["internal", "plugins/Extras.jar", "url"]]
# -> [["internal", "plugins/Extras.jar"]]
# -> [["internal"]]
def evaluate_filter($filter):
    $filter | indices("/") | length
    | truncate_stream(
        inputs
        | select(
            .[0] as $key
            | $key | join("/")
            | startswith($filter)));

# Flatten stream structure, stripping everything but the download
# path and it's properties
# <- [["internal", "plugins/Extras.jar", "type"], "zip"]
# <- [["internal", "plugins/Extras.jar", "url"], "..."]
# <- [["internal", "plugins/Extras.jar"]]
# <- [["internal"]]
# -> [["plugins/Extras.jar", "type"], "zip"]
# -> [["plugins/Extras.jar", "url"], "..."]
def get_downloads_obj:
    select(length == 2)
    | del(.[0][:-2]);

# Reduce flattened stream to an object
# <- [["plugins/Extras.jar", "type"], "zip"]
# <- [["plugins/Extras.jar", "url"], "..."]
# -> { "plugins/Extras.jar": {"type": "zip", "url": "..."} }
def reduce_to_object(stream):
    reduce stream as $in ({};
        setpath($in[0]; $in[1]));

# Turn object into a bash-readable string
# <- { "plugins/Extras.jar": {"type": "zip"} }
# -> plugins/Extras.jar
# zip
# { "url": ... }
def print_bash:
    to_entries[]
    | (.value | del(.type)) as $args
    | "\(.key)\n\(.value.type)\n\($args)";

reduce_to_object(
    if $arg1 == ""
        then inputs
        else evaluate_filter($arg1) end
    | get_downloads_obj)
| print_bash