sharkdp / shell-functools

Functional programming tools for the shell
MIT License
1.2k stars 49 forks source link

Offering: Add array support to `format` function #47

Open jdhedden opened 2 years ago

jdhedden commented 2 years ago

The current format function only support single-valued inputs. The below permits it to take arrays as inputs:

For ft/ft/functions.py:

@register("format")
@typed(None, T_STRING)
def format(format_str, inp):
    try:
        if type(inp) == list:
            args = list(map(lambda v: v.value, inp))
            return format_str.value.format(*args)
        else:
            return format_str.value.format(inp)
    except ValueError:
        panic("Incorrect format string '{}' for input '{}'.".format(format_str.value, inp))
    except IndexError:
        if type(inp) == list:
            count = len(inp)
        else:
            count = 1
        panic("Not enough arguments (only {} given) for format string '{}'.".format(count, format_str.value))

Example:

> echo -e '1\tone' | map format "'{}' is spelled '{}'"
'1' is spelled 'one'
sharkdp commented 2 years ago

Great idea. Note that I'm not using this project myself anymore, so I'm not really actively maintaining it. I'd be happy to merge a PR with proper tests though.