# bug 2007 import asyncdispatch, asyncnet, logging, json, uri, strutils, sugar type Builder = ref object client: Client build: Build ProgressCB* = proc (message: string): Future[void] {.closure, gcsafe.} Build* = ref object onProgress*: ProgressCB Client = ref ClientObj ClientObj = object onMessage: proc (client: Client, msg: JsonNode): Future[void] proc newClient*(name: string, onMessage: (Client, JsonNode) -> Future[void]): Client = new result result.onMessage = onMessage proc newBuild*(onProgress: ProgressCB): Build = new result result.onProgress = onProgress proc start(build: Build, repo, hash: string) {.async.} = let path = repo.parseUri().path.toLowerAscii() proc onProgress(builder: Builder, message: string) {.async.} = debug($message) proc onMessage(builder: Builder, message: JsonNode) {.async.} = debug("onMessage") proc newBuilder(): Builder = var cres: Builder new cres cres.client = newClient("builder", (client, msg) => (onMessage(cres, msg))) cres.build = newBuild( proc (msg: string): Future[void] {.closure, gcsafe.} = onProgress(cres, msg)) return cres proc main() = # Set up logging. var console = newConsoleLogger(fmtStr = verboseFmtStr) addHandler(console) var builder = newBuilder() # Test {.async.} pragma with do notation: #5995 builder.client = newClient("builder") do(client: Client, msg: JsonNode) {.async.}: await onMessage(builder, msg) main()