ParsersCommunity

Effect Schema 解析器

使用 Effect Schema 来解析和序列化 URL 状态。

Effect 是一个流行的 TypeScript 框架,它有自己的 schema 验证库:Effect Schema

Effect Schema 具有唯一特性,能够在不同类型之间编码双向转换。这使得它们非常适合用作 nuqs 解析器。

import { createParser } from 'nuqs'
import { Schema, Either, Equal } from 'effect'

function createSchemaParser<T, E extends string>(schema: Schema.Schema<T, E>) {
  const encoder = Schema.encodeUnknownEither(schema);
  const decoder = Schema.decodeUnknownEither(schema);
  return createParser({
    parse: (queryValue) => {
      const result = decoder(queryValue);
      return Either.getOrNull(result);
    },
    serialize: (value) => {
      const result = encoder(value);
      return Either.getOrThrowWith(
        result,
        (cause) =>
          new Error(`Failed to encode value: ${value}`, {
            cause,
          }),
      );
    },
    eq: (a, b) => Equal.equals(a, b),
  });
}

示例

import { Schema } from 'effect'

class User extends Schema.Class<User>('User')({
  name: Schema.String,
  age: Schema.Positive
}) {}

const ToBase64UrlEncodedJson = Schema.compose(Schema.StringFromBase64Url, Schema.parseJson())
const schema = Schema.compose(ToBase64UrlEncodedJson, User)

const parser = createSchemaParser(schema).withDefault(new User({ name: 'John Vim', age: 25 }))

const [user, setUser] = useQueryState('user', parser)

交互式演示