Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Schema: add support for Transformation + Struct in extend, closes #4536 #4546

Merged
merged 2 commits into from
Mar 2, 2025

Conversation

gcanti
Copy link
Contributor

@gcanti gcanti commented Mar 2, 2025

Example

Before

import { Schema } from "effect"

const A = Schema.Struct({
  a: Schema.String
})

const B = Schema.Struct({
  b: Schema.String
})

const C = Schema.Struct({
  c: Schema.String
})

const AB = Schema.transform(A, B, {
  strict: true,
  decode: (a) => ({ b: a.a }),
  encode: (b) => ({ a: b.b })
})

// Transformation + Struct
const schema = Schema.extend(AB, C)
/*
throws:
Error: Unsupported schema or overlapping types
details: cannot extend ({ readonly a: string } <-> { readonly b: string }) with { readonly c: string }
*/

After

import { Schema } from "effect"

const A = Schema.Struct({
  a: Schema.String
})

const B = Schema.Struct({
  b: Schema.String
})

const C = Schema.Struct({
  c: Schema.String
})

const AB = Schema.transform(A, B, {
  strict: true,
  decode: (a) => ({ b: a.a }),
  encode: (b) => ({ a: b.b })
})

// Transformation + Struct
const schema = Schema.extend(AB, C)

console.log(Schema.decodeUnknownSync(schema)({ a: "a", c: "c" }))
// Output: { b: 'a', c: 'c' }

console.log(Schema.encodeSync(schema)({ b: "b", c: "c" }))
// Output: { a: 'b', c: 'c' }

@gcanti gcanti added the schema label Mar 2, 2025
@gcanti gcanti requested a review from mikearnaldi as a code owner March 2, 2025 09:03
Copy link

changeset-bot bot commented Mar 2, 2025

🦋 Changeset detected

Latest commit: 172014e

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 36 packages
Name Type
effect Patch
@effect/cli Patch
@effect/cluster-browser Patch
@effect/cluster-node Patch
@effect/cluster-workflow Patch
@effect/cluster Patch
@effect/experimental Patch
@effect/opentelemetry Patch
@effect/platform-browser Patch
@effect/platform-bun Patch
@effect/platform-node-shared Patch
@effect/platform-node Patch
@effect/platform Patch
@effect/printer-ansi Patch
@effect/printer Patch
@effect/rpc-http Patch
@effect/rpc Patch
@effect/sql-clickhouse Patch
@effect/sql-d1 Patch
@effect/sql-drizzle Patch
@effect/sql-kysely Patch
@effect/sql-libsql Patch
@effect/sql-mssql Patch
@effect/sql-mysql2 Patch
@effect/sql-pg Patch
@effect/sql-sqlite-bun Patch
@effect/sql-sqlite-do Patch
@effect/sql-sqlite-node Patch
@effect/sql-sqlite-react-native Patch
@effect/sql-sqlite-wasm Patch
@effect/sql Patch
@effect/typeclass Patch
@effect/vitest Patch
@effect/ai Patch
@effect/ai-anthropic Patch
@effect/ai-openai Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@gcanti gcanti merged commit a0acec8 into main Mar 2, 2025
11 checks passed
@gcanti gcanti deleted the fix-4536 branch March 2, 2025 09:08
@github-actions github-actions bot mentioned this pull request Mar 2, 2025
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

1 participant