Skip to content

Commit f360aea

Browse files
authored
Add case expression overload for non-optional expressions (#26)
Fixes an ergonomic issue that otherwise required explicit `Optional.init`.
1 parent beaddb5 commit f360aea

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

Sources/StructuredQueriesCore/CaseExpression.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,23 @@ public struct Cases<Base, QueryValue: _OptionalProtocol>: QueryExpression {
9797
return cases
9898
}
9999

100+
/// Adds a `WHEN` clause to a `CASE` expression.
101+
///
102+
/// - Parameters:
103+
/// - condition: A condition to test.
104+
/// - expression: A return value should the condition pass.
105+
/// - Returns: A `CASE` expression builder.
106+
public func when(
107+
_ condition: some QueryExpression<Base>,
108+
then expression: some QueryExpression<QueryValue.Wrapped>
109+
) -> Cases {
110+
var cases = self
111+
cases.cases.append(
112+
When(predicate: condition.queryFragment, expression: expression.queryFragment).queryFragment
113+
)
114+
return cases
115+
}
116+
100117
/// Terminates a `CASE` expression with an `ELSE` clause.
101118
///
102119
/// - Parameter expression: A return value should every `WHEN` condition fail.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import Dependencies
2+
import Foundation
3+
import InlineSnapshotTesting
4+
import StructuredQueries
5+
import StructuredQueriesSQLite
6+
import StructuredQueriesTestSupport
7+
import Testing
8+
9+
extension SnapshotTests {
10+
@Suite struct CaseTests {
11+
@Test func dynamicCase() {
12+
let ids = Array([2, 3, 5, 1, 4].enumerated())
13+
let (first, rest) = (ids.first!, ids.dropFirst())
14+
assertQuery(
15+
Values(
16+
rest
17+
.reduce(Case(5).when(first.element, then: first.offset)) { cases, id in
18+
cases.when(id.element, then: id.offset)
19+
}
20+
.else(0)
21+
)
22+
) {
23+
"""
24+
SELECT CASE 5 WHEN 2 THEN 0 WHEN 3 THEN 1 WHEN 5 THEN 2 WHEN 1 THEN 3 WHEN 4 THEN 4 ELSE 0 END
25+
"""
26+
} results: {
27+
"""
28+
┌───┐
29+
│ 2 │
30+
└───┘
31+
"""
32+
}
33+
}
34+
}
35+
}

0 commit comments

Comments
 (0)