Невозможно сгенерировать автоматический кодировщик для Microsoft.FSharp.Core.Unit.Пожалуйста, передайте дополнительный кодировщик - PullRequest
1 голос
/ 11 июня 2019

Я создал вспомогательную функцию для возврата json в стиле Thoth.Json из моего проекта Giraffe, который принимает Result<'a,'b> и возвращает JSON.

let json result next (ctx: HttpContext) =
     match result with
            | Ok result ->
                    (setHttpHeader "Content-Type" "application/json" >=>
                        setBodyFromString (Encode.Auto.toString (0, result))) next ctx
            | Error e -> ...

Это прекрасно работает, пока я не вернусь Ok (), который компилируется и должен быть абсолютно корректным.

Однако, Тот. Джсон не очень любит это:

Cannot generate auto encoder for Microsoft.FSharp.Core.Unit. Please pass an extra encoder.

Как я могу проверить, является ли result unit или сделать ручку автоматического кодировщика unit?

1 Ответ

1 голос
/ 08 июля 2019

У меня была такая же проблема сегодня, я решил ее путем создания пользовательских Encoder<'T> и Decoder<T>.Как ни странно, это было не нужно месяц назад, и я бы поклялся, что ничего не обновлял.

Вот так выглядит кодировщик, вы можете использовать любой JSON в качестве возвращаемого значения.

open Thoth.Json.Net

module UnitEncoder =

    let encoder = fun _ -> JsonValue.Parse("null")

    let decoder = fun _ _ -> Ok ()

Вы можете определить сериализатор следующим образом

let extraCoders =
    Extra.empty
    |> Extra.withDecimal
    |> Extra.withCustom UnitEncoder.encoder UnitEncoder.decoder


let serializer = Thoth.Json.Giraffe.ThothSerializer(extra = extraCoders)

и зарегистрировать его как службу как обычно

services.AddSingleton<Giraffe.Serialization.Json.IJsonSerializer>(CN.ReportingServices.API.Serialization.serializer) |> ignore
...