import appster import appster/integration/owlkettleUtils ## Provides ServerData generic import owlkettle import owlkettle/adw import std/[sugar, options, logging, strformat] ## Define messages to be sent between background thread and owlkettle aka GUI thread type S2CMessage = distinct string ## Message from Server to Client type C2SMessage = distinct string ## Message from Client to Server ## Register procs for handling messages with `route` macro proc handlMsgOnServer(msg: C2SMessage, hub: auto) {.route: "server".} = ## Gets triggered when server thread gets message from owlkettle thread echo "On Server: Handling msg: ", msg.string proc handleMsgOnClient(msg: S2CMessage, hub: auto, state: WidgetState) {.route: "client".} ## Gets triggered when owlkettle thread gets message from server thread. Forward declared so that the implementation can type-cast WidgetState to AppState ## Generate types (ServerMessage, ClientMessage) and procs (sendMessageToServer/sendMessage) based on stuff stored with `route` macro generate("server") owlGenerate("client") ## Owlkettle App State stuff viewable App: server: ServerData[ServerMessage, ClientMessage] inputText: string receivedMessages: seq[string] method view(app: AppState): Widget = result = ## Implementation of handler of messages of type "S2CMessage" that Owlkettle receives from server proc handleS2CMessage(msg: S2CMessage, hub: auto, state: WidgetState) = echo "On Client: Handling msg: ", msg.string let state = state.AppState state.receivedMessages.add(msg.string)