antonmedv/fx

Any interest in implementing .[] in interactive mode?

Opened this issue · 1 comments

When viewing JSON in interactive mode, I'd love to be able to dig into arrays of objects by doing .[]. For example, in regular processing mode, I can pass a filter to fx on a top level array of objects like the example below, and get back a list of emails. So using this command curl "https://jsonplaceholder.typicode.com/comments" | fx '.[].email' will process JSON like this

[
  {
    "postId": 1,
    "id": 1,
    "name": "id labore ex et quam laborum",
    "email": "Eliseo@gardner.biz",
    "body": "laudantium enim quasi est quidem magnam voluptate ipsam eos\ntempora quo necessitatibus\ndolor quam autem quasi\nreiciendis et nam sapiente accusantium"
  },
  {
    "postId": 1,
    "id": 2,
    "name": "quo vero reiciendis velit similique earum",
    "email": "Jayne_Kuhic@sydney.com",
    "body": "est natus enim nihil est dolore omnis voluptatem numquam\net omnis occaecati quod ullam at\nvoluptatem error expedita pariatur\nnihil sint nostrum voluptatem reiciendis et"
  }
]

into a result like this

[
  "Eliseo@gardner.biz",
  "Jayne_Kuhic@sydney.com"
]

But I can't achieve the same thing in interactive mode. If I try typing .[].email, as soon as I type the second dot, it clears my prompt and refuses to dig into the array. Doing .[0].email works but only gives the first email.

Would this be a PR that you would support? I'm not familiar enough with the codebase to make this change myself yet, but if this is a change you would allow, I could try to start familiarizing myself to work through opening a PR.

Also if so, are there contribution docs anywhere? I couldn't find them. Thanks!

Yes, this is due to the fact what path is not a freeform JavaScript expression. It's a path of a cursor in JSON.

I have an idea to add full support arbitrary JS expressions in future as well.

One think I need to figure out, how to do argument splitting. Now fx relays on shell args splitting:

fx '.[].foo' func 'x => x.length'

How this string will be represented in a single string? Same with quotes? But this is ugly solution. With |?

.[].foo | func | x => x.length