cuelang / cue

CUE has moved to https://github.com/cue-lang/cue
https://cuelang.org
Apache License 2.0
3.09k stars 171 forks source link

Easier conditional groups in list comprehension #798

Closed verdverm closed 3 years ago

verdverm commented 3 years ago

Is your feature request related to a problem? Please describe.

I have a list which has elements that are conditionally included. Some of them are groups and always appear together. The way to write this most intuitively is an error.

Describe the solution you'd like

a: "on"

l: [
        if a == "on" {
                "a",
                "A",
        },
        "b",
        "c",
]
l.0: conflicting values "A" and "a":
    ./list.cue:5:3
    ./list.cue:6:3

Describe alternatives you've considered

myitcv commented 3 years ago

This will be addressed by the query proposal in #165:

a: "on"

l: [
        if a == "on" {
                ["a", "A"].*
        },
        "b",
        "c",
]
verdverm commented 3 years ago

Is there anything that hard prevents the suggested syntax above? (@mpvl)

The benefit I see with it is:

myitcv commented 3 years ago

Is there anything that hard prevents the suggested syntax above?

It's (currently) illegal because it's neither a valid embedded scalar, nor it is a valid struct value.

the ease of line edits, i.e. I can add or remove a line rather than editing within a line

Like this?

a: "on"

l: [
        if a == "on" {[
                "a", 
                "A"
        ].*},
        "b",
        "c",
]

no need for extra list style syntax, the query syntax is only marginally better than the list comp syntax

It's true there is a close relationship between the two, but I'm not sure we'd want to introduce a "third" way of writing things.

Re-opening for @mpvl's answer in any case.

verdverm commented 3 years ago

For some extra context, this started from a discussion on Slack, where one of the examples is the following

a: "on"
x: "on"
b: "on"
c: "off"
aa: ["a", "A", "eh?"]
xx: ["x", "x", "ex"]
l: [
        for A in aa if a == "on" { A }
        for X in xx if x == "on" { X }
        if b == "on" {
                "b"
        }
        if c == "on" {
                "C"
        }
]
mpvl commented 3 years ago

@verdverm: the suggested syntax would contradict what that syntax typically means. It already means something in one context and it would be very unsurprising to have it mean something else in another. There are probably also cases where the original syntax has meaning in this context.

cueckoo commented 3 years ago

This issue has been migrated to https://github.com/cue-lang/cue/issues/798.

For more details about CUE's migration to a new home, please see https://github.com/cue-lang/cue/issues/1078.