1- import { SchemaAST , Effect , Schema as S , Option , Context } from "effect"
1+ import { Effect , Schema as S , Option , Context , Layer } from "effect"
22
33import * as Binding from "./Binding.ts"
44
55export interface KvDefinition {
66 readonly key : S . Top & { Encoded : string }
77
88 readonly value : S . Top
9+
10+ readonly binding : string
911}
1012
1113export interface Kv < Self , Id extends string , D extends KvDefinition > extends Context . Service < Self , KVNamespace > {
1214 new ( _ : never ) : Context . ServiceClass . Shape < Id , KVNamespace >
1315
14- readonly definition : D
16+ readonly layer : Layer . Layer < Self , S . SchemaError , never >
17+
18+ readonly "~" : {
19+ readonly key : D [ "key" ]
1520
16- readonly transcoders : {
17- readonly encodeKey : ReturnType < typeof S . encodeEffect < D [ "key" ] > >
18- readonly decodeKey : ReturnType < typeof S . decodeEffect < D [ "key" ] > >
19- readonly encodeValue : (
20- input : unknown ,
21- options ?: SchemaAST . ParseOptions | undefined ,
22- ) => Effect . Effect < string , S . SchemaError , D [ "value" ] [ "EncodingServices" ] >
23- readonly decodeValue : (
24- input : unknown ,
25- options ?: SchemaAST . ParseOptions ,
26- ) => Effect . Effect < D [ "value" ] [ "Type" ] , S . SchemaError , D [ "value" ] [ "DecodingServices" ] >
21+ readonly value : S . fromJsonString <
22+ S . Codec < D [ "value" ] [ "Type" ] , S . Json , D [ "value" ] [ "DecodingServices" ] , D [ "value" ] [ "EncodingServices" ] >
23+ >
2724 }
2825}
2926
30- export const Kv =
27+ export const Service =
3128 < Self > ( ) =>
3229 < Id extends string , D extends KvDefinition > ( id : Id , definition : D ) : Kv < Self , Id , D > => {
3330 const tag = Context . Service < Self , KVNamespace > ( ) ( id )
34-
35- const { key, value } = definition
36-
37- const transcoders = {
38- encodeKey : S . encodeEffect ( key ) ,
39- decodeKey : S . decodeEffect ( key ) ,
40- encodeValue : S . encodeEffect ( S . fromJsonString ( S . toCodecJson ( value ) ) ) ,
41- decodeValue : S . decodeUnknownEffect ( S . fromJsonString ( S . toCodecJson ( value ) ) ) ,
42- }
43-
4431 return Object . assign ( tag , {
45- definition,
46- transcoders,
47- layer : Binding . layer ( tag , [ "get" , "put" , "delete" , "list" , "getWithMetadata" ] ) ,
32+ layer : Binding . layer ( tag , [ "get" , "put" , "delete" , "list" , "getWithMetadata" ] ) ( definition . binding ) ,
33+ "~" : {
34+ key : definition . key ,
35+ value : S . fromJsonString ( S . toCodecJson ( definition . value ) ) ,
36+ } ,
4837 } )
4938 }
5039
@@ -54,8 +43,8 @@ export const put = Effect.fnUntraced(function* <Self, Id extends string, D exten
5443 value : D [ "value" ] [ "Type" ] ,
5544) {
5645 const resolved = yield * kv
57- const keyEncoded = yield * kv . transcoders . encodeKey ( key )
58- const valueEncoded = yield * kv . transcoders . encodeValue ( value )
46+ const keyEncoded = yield * S . encodeEffect ( kv [ "~" ] . key ) ( key )
47+ const valueEncoded = yield * S . encodeEffect ( kv [ "~" ] . value ) ( value )
5948 yield * Effect . promise ( ( ) => resolved . put ( keyEncoded , valueEncoded ) )
6049} )
6150
@@ -64,19 +53,19 @@ export const get = Effect.fnUntraced(function* <Self, Id extends string, D exten
6453 key : D [ "key" ] [ "Type" ] ,
6554) {
6655 const resolved = yield * kv
67- const keyEncoded = yield * kv . transcoders . encodeKey ( key )
56+ const keyEncoded = yield * S . encodeEffect ( kv [ "~" ] . key ) ( key )
6857 const value = yield * Effect . promise ( ( ) => resolved . get ( keyEncoded ) )
6958 if ( value === null ) {
7059 return Option . none ( )
7160 }
72- return yield * kv . transcoders . decodeValue ( value ) . pipe ( Effect . map ( Option . some ) )
61+ return yield * S . decodeUnknownEffect ( kv [ "~" ] . value ) ( value ) . pipe ( Effect . map ( Option . some ) )
7362} )
7463
7564export const remove = Effect . fnUntraced ( function * < Self , Id extends string , D extends KvDefinition > (
7665 kv : Kv < Self , Id , D > ,
7766 key : D [ "key" ] [ "Type" ] ,
7867) {
7968 const resolved = yield * kv
80- const keyEncoded = yield * kv . transcoders . encodeKey ( key )
69+ const keyEncoded = yield * S . encodeEffect ( kv [ "~" ] . key ) ( key )
8170 yield * Effect . promise ( ( ) => resolved . delete ( keyEncoded ) )
8271} )
0 commit comments