softwaremill / softwaremill/tapir
[BUG] Option of CommaSeparated has a strange behavior when no value is provided
Nobody has claimed this yet.
- Dominant language
- Scala
- Stars
- 1.5k
- Forks
- 468
- Avg merge
- 5h 37m
- Merged PRs (30d)
- 34
Description
Tapir version: *** 1.10.10
Scala version: *** 2.13
Describe the bug
I need to have an optional list of parameters. This list comes from a query parameter that is either not present in the query at all, defined without a value, or defined with a comma-separated list of values.
Use case:
For example, let's take the parameter "sort" and "desc", which controls the sorting of an API result. Sort indicates the list of fields to be sorted, in order, and desc indicates the direction. If desc is:
- absent from the query, then sorting is ascending.
- present without value, then the sort is descending on all fields.
- present with value, then sorting is ascending except on fields listed in desc.
This use case is in fact an implementation of a design proposed by Octo on the sorting of a REST API.
I then expect to have to declare something like:
query[Option[CommaSeparated[String]]]("desc")
.map(_.map(_.values))(values => values.map(Delimited.apply))
In reality I have to do:
query[Option[CommaSeparated[String]]]("desc")
.map(_.map(_.values.filterNot(_.isBlank)))(values => values.map(Delimited.apply))
What is the problem?
The problem is that in the case where the parameter is supplied without a value, I should have Some(Nil) as the decoded value, but I actually have Some(List("")). And if the codec type is not a string but an enumeration or something else, then the decoding return an error for invalid value.
For my opinion, this result is not what we can expect when we declare a query input as "option of list".
What do you think about that ?
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
The queryOption[CommaSeparated[String]] example is the entry point; reproduce the absent, valueless, and comma-separated cases described. Trace CommaSeparated decoding and add or adjust coverage so a valueless optional list decodes as Some(Nil), while non-empty values still decode normally and empty values do not cause enum errors.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- scala
- Domain
- api
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100