Skip to content

Commit 31be72a

Browse files
authored
Add support for Schema.Enums in HttpApiBuilder.isSingleStringType, closes #4471 (#4472)
1 parent d7ad83d commit 31be72a

File tree

6 files changed

+95
-3
lines changed

6 files changed

+95
-3
lines changed

.changeset/cold-lizards-cough.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
---
2+
"effect": patch
3+
---
4+
5+
Fix `Schema.Enums` `toString()` method to display correct enum values.
6+
7+
Now, `toString()` correctly displays the actual enum values instead of internal numeric indices.
8+
9+
**Before**
10+
11+
```ts
12+
import { Schema } from "effect"
13+
14+
enum Fruits {
15+
Apple = "apple",
16+
Banana = "banana",
17+
Cantaloupe = 0
18+
}
19+
20+
const schema = Schema.Enums(Fruits)
21+
22+
console.log(String(schema))
23+
// Output: <enum 3 value(s): 0 | 1 | 2> ❌ (incorrect)
24+
```
25+
26+
**After**
27+
28+
```ts
29+
import { Schema } from "effect"
30+
31+
enum Fruits {
32+
Apple = "apple",
33+
Banana = "banana",
34+
Cantaloupe = 0
35+
}
36+
37+
const schema = Schema.Enums(Fruits)
38+
39+
console.log(String(schema))
40+
// Output: <enum 3 value(s): "apple" | "banana" | 0> ✅ (correct)
41+
```

.changeset/tiny-otters-wave.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@effect/platform": patch
3+
---
4+
5+
Add support for `Schema.Enums` in `HttpApiBuilder.isSingleStringType`, closes #4471.

packages/effect/src/SchemaAST.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1067,7 +1067,7 @@ export class Enums implements Annotated {
10671067
toString() {
10681068
return Option.getOrElse(
10691069
getExpected(this),
1070-
() => `<enum ${this.enums.length} value(s): ${this.enums.map((_, value) => JSON.stringify(value)).join(" | ")}>`
1070+
() => `<enum ${this.enums.length} value(s): ${this.enums.map(([_, value]) => JSON.stringify(value)).join(" | ")}>`
10711071
)
10721072
}
10731073
/**

packages/effect/test/Schema/Schema/Enums/Enums.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ describe("Enums", () => {
5858
await Util.assertions.decoding.fail(
5959
schema,
6060
"Cantaloupe",
61-
`Expected <enum 3 value(s): 0 | 1 | 2>, actual "Cantaloupe"`
61+
`Expected <enum 3 value(s): "apple" | "banana" | 0>, actual "Cantaloupe"`
6262
)
6363
})
6464

@@ -85,7 +85,7 @@ describe("Enums", () => {
8585
await Util.assertions.decoding.fail(
8686
schema,
8787
"Cantaloupe",
88-
`Expected <enum 3 value(s): 0 | 1 | 2>, actual "Cantaloupe"`
88+
`Expected <enum 3 value(s): "apple" | "banana" | 3>, actual "Cantaloupe"`
8989
)
9090
})
9191

packages/platform/src/HttpApiBuilder.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,7 @@ function isSingleStringType(ast: AST.AST, key?: PropertyKey): boolean {
569569
case "StringKeyword":
570570
case "Literal":
571571
case "TemplateLiteral":
572+
case "Enums":
572573
return true
573574
case "TypeLiteral": {
574575
if (key !== undefined) {

packages/platform/test/HttpApiBuilder.test.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,29 @@ const assertNormalizedUrlParams = <UrlParams extends Schema.Schema.Any>(
1515
describe("HttpApiBuilder", () => {
1616
describe("normalizeUrlParams", () => {
1717
describe("Property Signatures", () => {
18+
it("Enums", () => {
19+
enum Fruits {
20+
A = "a",
21+
B = "b"
22+
}
23+
24+
const schema = Schema.Struct({
25+
a: Schema.Enums(Fruits)
26+
})
27+
assertNormalizedUrlParams(schema, { a: "a" }, { a: "a" })
28+
assertNormalizedUrlParams(schema, { a: "b" }, { a: "b" })
29+
assertNormalizedUrlParams(schema, { a: ["a"] }, { a: ["a"] })
30+
assertNormalizedUrlParams(schema, { a: ["b"] }, { a: ["b"] })
31+
})
32+
33+
it("TemplateLiteral", () => {
34+
const schema = Schema.Struct({
35+
a: Schema.TemplateLiteral("a", Schema.String)
36+
})
37+
assertNormalizedUrlParams(schema, { a: "a" }, { a: "a" })
38+
assertNormalizedUrlParams(schema, { a: ["a"] }, { a: ["a"] })
39+
})
40+
1841
it("String", () => {
1942
const schema = Schema.Struct({ a: Schema.String })
2043
assertNormalizedUrlParams(schema, { a: "a" }, { a: "a" })
@@ -102,6 +125,28 @@ describe("HttpApiBuilder", () => {
102125
})
103126

104127
describe("Index Signatures", () => {
128+
it("Enums", () => {
129+
enum Fruits {
130+
A = "a",
131+
B = "b"
132+
}
133+
134+
const schema = Schema.Record({
135+
key: Schema.String,
136+
value: Schema.Enums(Fruits)
137+
})
138+
assertNormalizedUrlParams(schema, { a: "a" }, { a: "a" })
139+
assertNormalizedUrlParams(schema, { a: "b" }, { a: "b" })
140+
})
141+
142+
it("TemplateLiteral", () => {
143+
const schema = Schema.Record({
144+
key: Schema.String,
145+
value: Schema.TemplateLiteral("a", Schema.String)
146+
})
147+
assertNormalizedUrlParams(schema, { a: "a" }, { a: "a" })
148+
})
149+
105150
it("String", () => {
106151
const schema = Schema.Record({
107152
key: Schema.String,

0 commit comments

Comments
 (0)