Skip to content

Commit

Permalink
Schema: add default title annotations to both sides of Struct transfo… (
Browse files Browse the repository at this point in the history
  • Loading branch information
gcanti committed Apr 20, 2024
1 parent a58b7de commit b3fe829
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 28 deletions.
57 changes: 57 additions & 0 deletions .changeset/blue-geese-fold.md
@@ -0,0 +1,57 @@
---
"@effect/schema": patch
---

Add default title annotations to both sides of Struct transformations.

This simple addition helps make error messages shorter and more understandable.

Before

```ts
import { Schema } from "@effect/schema"

const schema = Schema.Struct({
a: Schema.optional(Schema.String, { exact: true, default: () => "" }),
b: Schema.String,
c: Schema.String,
d: Schema.String,
e: Schema.String,
f: Schema.String
})

Schema.decodeUnknownSync(schema)({ a: 1 })
/*
throws
Error: ({ a?: string; b: string; c: string; d: string; e: string; f: string } <-> { a: string; b: string; c: string; d: string; e: string; f: string })
└─ Encoded side transformation failure
└─ { a?: string; b: string; c: string; d: string; e: string; f: string }
└─ ["a"]
└─ Expected a string, actual 1
*/
```

Now

```ts
import { Schema } from "@effect/schema"

const schema = Schema.Struct({
a: Schema.optional(Schema.String, { exact: true, default: () => "" }),
b: Schema.String,
c: Schema.String,
d: Schema.String,
e: Schema.String,
f: Schema.String
})

Schema.decodeUnknownSync(schema)({ a: 1 })
/*
throws
Error: (Struct (Encoded side) <-> Struct (Type side))
└─ Encoded side transformation failure
└─ Struct (Encoded side)
└─ ["a"]
└─ Expected a string, actual 1
*/
```
4 changes: 2 additions & 2 deletions packages/schema/src/Schema.ts
Expand Up @@ -2098,8 +2098,8 @@ class TypeLiteralImpl<
})
}
return new AST.Transformation(
new AST.TypeLiteral(from, issFrom),
new AST.TypeLiteral(to, issTo),
new AST.TypeLiteral(from, issFrom, { [AST.TitleAnnotationId]: "Struct (Encoded side)" }),
new AST.TypeLiteral(to, issTo, { [AST.TitleAnnotationId]: "Struct (Type side)" }),
new AST.TypeLiteralTransformation(transformations)
)
}
Expand Down
8 changes: 4 additions & 4 deletions packages/schema/test/Schema/PropertySignature.test.ts
Expand Up @@ -99,9 +99,9 @@ describe("PropertySignature", () => {
await Util.expectDecodeUnknownFailure(
schema,
{ a: "a" },
`({ a?: NumberFromString } <-> { a: number })
`(Struct (Encoded side) <-> Struct (Type side))
└─ Encoded side transformation failure
└─ { a?: NumberFromString }
└─ Struct (Encoded side)
└─ ["a"]
└─ NumberFromString
└─ Transformation process failure
Expand All @@ -128,9 +128,9 @@ describe("PropertySignature", () => {
await Util.expectDecodeUnknownFailure(
schema,
{ a: "a" },
`({ a?: NumberFromString } <-> { a: number })
`(Struct (Encoded side) <-> Struct (Type side))
└─ Encoded side transformation failure
└─ { a?: NumberFromString }
└─ Struct (Encoded side)
└─ ["a"]
└─ NumberFromString
└─ Transformation process failure
Expand Down
44 changes: 22 additions & 22 deletions packages/schema/test/Schema/optional.test.ts
Expand Up @@ -90,9 +90,9 @@ describe("optional APIs", () => {
await Util.expectDecodeUnknownFailure(
schema,
{ a: "a" },
`({ a?: NumberFromString | null | undefined } <-> { a?: number | undefined })
`(Struct (Encoded side) <-> Struct (Type side))
└─ Encoded side transformation failure
└─ { a?: NumberFromString | null | undefined }
└─ Struct (Encoded side)
└─ ["a"]
└─ NumberFromString | null | undefined
├─ Union member
Expand Down Expand Up @@ -122,9 +122,9 @@ describe("optional APIs", () => {
await Util.expectDecodeUnknownFailure(
schema,
{ a: undefined },
`({ a?: NumberFromString | null } <-> { a?: number })
`(Struct (Encoded side) <-> Struct (Type side))
└─ Encoded side transformation failure
└─ { a?: NumberFromString | null }
└─ Struct (Encoded side)
└─ ["a"]
└─ NumberFromString | null
├─ Union member
Expand All @@ -137,9 +137,9 @@ describe("optional APIs", () => {
await Util.expectDecodeUnknownFailure(
schema,
{ a: "a" },
`({ a?: NumberFromString | null } <-> { a?: number })
`(Struct (Encoded side) <-> Struct (Type side))
└─ Encoded side transformation failure
└─ { a?: NumberFromString | null }
└─ Struct (Encoded side)
└─ ["a"]
└─ NumberFromString | null
├─ Union member
Expand Down Expand Up @@ -167,9 +167,9 @@ describe("optional APIs", () => {
{
a: "a"
},
`({ a?: NumberFromString } <-> { a: Option<number> })
`(Struct (Encoded side) <-> Struct (Type side))
└─ Encoded side transformation failure
└─ { a?: NumberFromString }
└─ Struct (Encoded side)
└─ ["a"]
└─ NumberFromString
└─ Transformation process failure
Expand All @@ -194,9 +194,9 @@ describe("optional APIs", () => {
{
a: "a"
},
`({ a?: NumberFromString | null } <-> { a: Option<number> })
`(Struct (Encoded side) <-> Struct (Type side))
└─ Encoded side transformation failure
└─ { a?: NumberFromString | null }
└─ Struct (Encoded side)
└─ ["a"]
└─ NumberFromString | null
├─ Union member
Expand All @@ -223,9 +223,9 @@ describe("optional APIs", () => {
{
a: "a"
},
`({ a?: NumberFromString | undefined } <-> { a: Option<number> })
`(Struct (Encoded side) <-> Struct (Type side))
└─ Encoded side transformation failure
└─ { a?: NumberFromString | undefined }
└─ Struct (Encoded side)
└─ ["a"]
└─ NumberFromString | undefined
├─ Union member
Expand Down Expand Up @@ -255,9 +255,9 @@ describe("optional APIs", () => {
{
a: "a"
},
`({ a?: NumberFromString | null | undefined } <-> { a: Option<number> })
`(Struct (Encoded side) <-> Struct (Type side))
└─ Encoded side transformation failure
└─ { a?: NumberFromString | null | undefined }
└─ Struct (Encoded side)
└─ ["a"]
└─ NumberFromString | null | undefined
├─ Union member
Expand Down Expand Up @@ -285,9 +285,9 @@ describe("optional APIs", () => {
await Util.expectDecodeUnknownFailure(
schema,
{ a: "a" },
`({ a?: NumberFromString } <-> { a: number })
`(Struct (Encoded side) <-> Struct (Type side))
└─ Encoded side transformation failure
└─ { a?: NumberFromString }
└─ Struct (Encoded side)
└─ ["a"]
└─ NumberFromString
└─ Transformation process failure
Expand All @@ -310,9 +310,9 @@ describe("optional APIs", () => {
await Util.expectDecodeUnknownFailure(
schema,
{ a: "a" },
`({ a?: NumberFromString | undefined } <-> { a: number })
`(Struct (Encoded side) <-> Struct (Type side))
└─ Encoded side transformation failure
└─ { a?: NumberFromString | undefined }
└─ Struct (Encoded side)
└─ ["a"]
└─ NumberFromString | undefined
├─ Union member
Expand Down Expand Up @@ -340,9 +340,9 @@ describe("optional APIs", () => {
await Util.expectDecodeUnknownFailure(
schema,
{ a: "a" },
`({ a?: NumberFromString | null | undefined } <-> { a: number })
`(Struct (Encoded side) <-> Struct (Type side))
└─ Encoded side transformation failure
└─ { a?: NumberFromString | null | undefined }
└─ Struct (Encoded side)
└─ ["a"]
└─ NumberFromString | null | undefined
├─ Union member
Expand Down Expand Up @@ -371,9 +371,9 @@ describe("optional APIs", () => {
await Util.expectDecodeUnknownFailure(
schema,
{ a: "a" },
`({ a?: NumberFromString | null } <-> { a: number })
`(Struct (Encoded side) <-> Struct (Type side))
└─ Encoded side transformation failure
└─ { a?: NumberFromString | null }
└─ Struct (Encoded side)
└─ ["a"]
└─ NumberFromString | null
├─ Union member
Expand Down

0 comments on commit b3fe829

Please sign in to comment.