github-workflows-kt icon indicating copy to clipboard operation
github-workflows-kt copied to clipboard

[Core feature request] Support operators for type-safe expressions

Open Vampire opened this issue 3 years ago • 4 comments

What feature do you need? https://docs.github.com/en/actions/learn-github-actions/expressions#operators It would be nice if you could construct more complex expressions using operators with the type-safe expr API. One way would be to model them as explicit functions like expr { and(always(), success()) } to get ${{ always() && success() }}. An even nicer way would of course be if operator overloading is used, so that you can actually do expr { always() && success() }} instead. Those ways also need to support some way of textual input to support not yet supported contexts like step outcome, or matrix values.

Do you have an example usage?

if: always() && (steps.execute_action.outcome == 'success')

Is there a workaround for not having this feature? If yes, please describe it. Work-around is to not use the type-safe API, but simple strings.

Vampire avatar Jul 29 '22 16:07 Vampire

Another example: https://stackoverflow.com/a/72408109/16358266 suggests to use

group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}

It would be nice to be able to model it like

group = "${expr { github.workflow }}-${expr { github.eventPullRequest.pull_request.number || github.ref }"

instead of

group = "${expr { github.workflow }}-${expr("${github.eventPullRequest.pull_request.number} || ${github.ref}")}"

Vampire avatar Apr 11 '23 22:04 Vampire

One nice thing about this is that it could allow for better checks beyond the expression itself.

For example when using job.result, it could runtime check that the job A whose job B is using the result is declared in the needs of job B.

Runtime check here is better than GitHub's post-commit runtime check, and almost as good as a compile-time check (I guess we can say the Kotlin script Workflow compiles to YAML in a way).

LouisCAD avatar Nov 20 '23 10:11 LouisCAD

it could runtime check that the job A whose job B is using the result is declared in the needs of job B.

Or it could maybe even auto-needs it.

Vampire avatar Nov 20 '23 12:11 Vampire

True, would be even better!

LouisCAD avatar Nov 20 '23 15:11 LouisCAD