如何在 SAFE 堆栈中为 Thoth.Json 编写 encoders/decoders?

How do I write encoders/decoders for Thoth.Json in the SAFE Stack?

我正在使用 SAFE 堆栈构建应用程序,我的模型中有一个 System.Uri。 当我 运行 我的代码时,我在控制台中收到错误消息“无法为 System.Uri 生成自动编码器...”
到目前为止,我的谷歌搜索让我来到这里

module CustomEncoders

open Thoth.Json
let uriEncoder (uri:System.Uri) = Encode.string (uri.ToString())

let uriDecoder = ????

let myExtraCoders =
    Extra.empty
    |> Extra.withCustom uriEncoder uriDecoder 


let modelEncoder = Encode.Auto.generateEncoder(extra = myExtraCoders)
let modelDecoder = Decode.Auto.generateDecoder(extra = myExtraCoders)

然后在我的 App.fs 中添加

|> Program.withDebuggerCoders CustomEncoders.modelEncoder CustomEncoders.modelDecoder

我想我已经了解了如何创建编码器,但我不知道如何编写解码器部分。
我显然可以用字符串替换我的 System.Uri 字段,但感觉这不是正确的解决方案。

查看 Decoder Type,它具有以下签名 string -> JsonValue -> Result<'T, DecoderError>

在哪里

  • 字符串:从 json 值
  • 到 select 的 json 路径
  • JsonValue:原始 json 解码

它要么 returns 一个 Ok<'T> 要么 Error<DecoderError>

所以你的uri Decoder将如下

let uriDecoder path (token: JsonValue) =
    let value = token.Value<string>()
    match System.Uri.TryCreate(value, System.UriKind.Absolute) with
    | (true, uri) -> Ok uri
    | (false, _) -> Error (path, BadPrimitive("Uri", token))