Как решить проблему с кодировщиком с помощью отладчика Elmi sh? - PullRequest
1 голос
/ 20 апреля 2020

У меня есть приложение, которое я построил в SAFE-Stack с использованием веб-сокетов, более или менее следуя подходу, приведенному здесь: https://github.com/CompositionalIT/safe-sockets

Работает нормально, но Elmi sh отладчику не нравится тип WsSender в этом примере:


type ConnectionState =
        | DisconnectedFromServer
        | ConnectedToServer of WsSender
        | Connecting

        member this.IsConnected =
            match this with
            | ConnectedToServer _ -> true
            | DisconnectedFromServer | Connecting -> false

    and WsSender = Msg -> Unit

, выдающий следующее сообщение об ошибке в консоли браузера:

ElmishDebuggerMessage

Может кто-нибудь сказать мне, как go об устранении этой проблемы? (Предполагая, что это можно исправить, и что я правильно диагностировал проблему.) Спасибо.

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

вы видите эту ошибку из-за того, что Elmi sh .Debugger использует Thoth. Json для сериализации вашего Msg / Model в формате JSON.

Тип WsSender не может быть представлен в формате JSON, потому что это функция. Итак, Тот. Json просит вас объяснить, как он должен кодировать этот тип.

Вы можете сделать это, создав то, что называется extraCoder следующим образом:

В вашем случае, вам нужно будет создать поддельный кодер / декодер "просто", чтобы сделать отладчик счастливым.

module CustomEncoders =

    let wsSenderEncoder (_ : WsSender) = Encode.string "WsSender function"

    let wsSenderDecoder = Decode.fail "Decoding is not supported for WsSender type"

    let myExtraCoders =
        Extra.empty
        |> Extra.withCustom wsSenderEncoder wsSenderDecoder 


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

При создании вашей программы вы должны заменить Program.withDebugger на Program.withDebuggerCoders и дать ему кодер и декодер. Вы создали.

Program.withDebuggerCoders CustomEncoders.modelEncoder CustomEncoders.modelDecoder
0 голосов
/ 20 апреля 2020

Мне пришлось немного поиграть, чтобы попытаться придумать что-нибудь, что упростит использование нескольких дополнительных кодировщиков, если потребуется. Кажется, это работает - хотя это может быть полезно для других.


module CustomEncoders =

    let inline addDummyCoder<'b> extrasIn =
        let typeName = string typeof<'b>
        let simpleEncoder(_ : 'b) = Encode.string (sprintf "%s function" typeName)
        let simpleDecoder = Decode.fail (sprintf "Decoding is not supported for %s type" typeName)
        extrasIn |> Extra.withCustom simpleEncoder simpleDecoder

    let inline buildExtras<'a> extraCoders =
        let myEncoder:Encoder<'a> = Encode.Auto.generateEncoder(extra = extraCoders)
        let myDecoder:Decoder<'a> = Decode.Auto.generateDecoder(extra = extraCoders)
        (myEncoder, myDecoder)

type TestType = Msg -> Unit
type TestType2 = string -> Unit

let extras = Extra.empty
                |> CustomEncoders.addDummyCoder<TestType>
                |> CustomEncoders.addDummyCoder<TestType2>
                |> CustomEncoders.buildExtras<Model.Model>


#if DEBUG
open Elmish.Debug
open Elmish.HMR
#endif


Program.mkProgram Model.init Model.update View.render
|> Program.withSubscription subs 
#if DEBUG
|> Program.withConsoleTrace
#endif
|> Program.withReactBatched "elmish-app"
#if DEBUG
|> Program.withDebuggerCoders (fst extras) (snd extras)
#endif
|> Program.run


Если у кого-то есть лучшее представление о том, как это сделать, я буду рад обновить этот ответ своими предложениями. Кроме того, апостроф в типе generi c, кажется, расстраивает префиксатор кода выше - нужно ли что-то делать, чтобы это исправить?

...