Skip to content

Support user-defined verbs #1836

@balki

Description

@balki

miller verbs are great. Easy to use, saves key strokes and easy to understand. It would be nice to extend those benefits to user-defined verbs.

Proposal

Users can create new verbs by registering them using below function. This function will be called in a miller file loaded using --[m]load.

register_verb(func, name, description, flags)
  • name is string
  • description is string for use in mlr help
  • flags is an array of flag which is a map with keys short, long, description, type, default. At least one of short or long is required. Rest are of them are optional.
  • type can be "bool", "single", or "multi". default is "single". "multi" means it can occur multiple times. e.g. verb -f arg1-f arg2 -f arg3. Accessed in the function as a list arg["f"] will be ["arg1", "arg2", "arg3"].
  • when type is bool, it can be turned off with --no- prefix. i.e. --no-longname.
  • bool flags can be coalesced. i.e. -xyz foo is same as -x -y -z foo.
  • one of the flag can have long set to [POS] which refers to positional argument. type is always single
  • func is a miller function that will be called with one argument args. It is a map with passed flags.

Example

register_verb(bconv, "bconv", "Convert bytes to KB, MB, GB or TB", [
{
"short": "s",
"long":"source",
"type":"single",
"default":"B",
"description":"Source unit. One of B, KB, MB, GB"
},
{
"short": "t",
"long":"target",
"type":"single",
"default": "auto",
"description":"Target unit. One of B, KB, MB, GB, auto. If auto, appropriate unit is chosen"
},
{
"short": "x",
"long":"suffix",
"type":"bool",
"default":true,
"description":"Add suffix after conversion. E.g. 2.4 MB"
},
{
"long":"[POS]",
"description":"comma separated list of fields to convert"
}
]
)

func bconf(args) {
if (args["suffix"]) { ... }
}

Namespace

  1. Keep user defined verbs same namespace as standard ones. (similar to user defined functions).
  2. Have user-defined verbs start with capital letter. Similar to go functions.
  3. [my choice] Prefix user-defined verbs with u: or a different prefix. E.g. mlr --l2p u:bconv Memory,Swap then head.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions