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)