soasme/nim-schedules

Error: type mismatch: got <id: string, interval: TimeInterval, throttleNum: int literal(1), startTime: Option[times.DateTime], endTime: Option[times.DateTime], asyncProc: proc (): Future[system.void]{.locks: <unknown>.}>

AboveAverageDeveloper opened this issue · 1 comments

version: nim 1.3.5
package version: 0.1.0

/home/jake/Documents/catrack/src/catrack.nim(41, 11) template/generic instantiation of `scheduler` from here
        ... /home/jake/.nimble/pkgs/schedules-#head/schedules.nim(342, 16) Error: type mismatch: got <id: string, interval: TimeInterval, throttleNum: int literal(1), startTime: Option[times.DateTime], endTime: Option[times.DateTime], asyncProc: proc (): Future[system.void]{.locks: <unknown>.}>
        ... but expected one of: 
        ... proc initBeater(interval: TimeInterval; asyncProc: BeaterAsyncProc;
        ...                startTime: Option[DateTime] = none(DateTime);
        ...                endTime: Option[DateTime] = none(DateTime); id: string = "";
        ...                throttleNum: int = 1): Beater
        ...   first type mismatch at position: 6
        ...   required type for asyncProc: BeaterAsyncProc
        ...   but expression 'asyncProc = proc (): owned(Future[void]) =
        ...   template await(f`gensym53840047: typed): untyped {.used.} =
        ...     static :
        ...       error "await expects Future[T], got " & $typeof(f`gensym53840047)
        ...   template await[T](f`gensym53840048: Future[T]): auto {.used.} =
        ...     var internalTmpFuture`gensym53840049_53845020: FutureBase = f`gensym53840048
        ...     yield internalTmpFuture`gensym53840049_53845020
        ...     (cast[type(f`gensym53840048)](internalTmpFuture`gensym53840049_53845020)).read()
        ...   var retFuture_53840040 = newFuture("anonymous")
        ...   iterator anonymousIter_53840041(): owned(FutureBase) {.closure.} =
        ...     echo(["updating shows"])
        ...     let account = getAccount()
        ...     for show in items(get(select(table(RDB(), "show"), ["id"]))):
        ...       let showID = getInt(show["id"], 0)
        ...       let showDetails =
        ...         var internalTmpFuture`gensym53840049`gensym53845048: FutureBase = getShowDetails(
        ...             account, showID)
        ...         yield internalTmpFuture`gensym53840049`gensym53845048
        ...         read(cast[type(getShowDetails(account, showID))](internalTmpFuture`gensym53840049`gensym53845048))
        ...       for season in items(showDetails.seasons):
        ...         if season.season_number == 0:
        ...           continue
        ...         let seasonDetails =
        ...           var internalTmpFuture`gensym53840049`gensym53860216: FutureBase = getSeason(
        ...               account, showID, season.season_number)
        ...           yield internalTmpFuture`gensym53840049`gensym53860216
        ...           read(cast[type(getSeason(account, showID, season.season_number))](internalTmpFuture`gensym53840049`gensym53860216))
        ...         for episode in items(seasonDetails.episodes):
        ...           try:
        ...             insert(table(RDB(), "episode"), `%`([("showID", `%`(showDetails.id)),
        ...                 ("season", `%`(season.season_number)),
        ...                 ("episode", `%`(episode.episode_number)), ("id", `%`(episode.id)),
        ...                 ("airdate", `%`(episode.air_date)), ("status", `%`(0))]))
        ...           except:
        ...             echo(["already in db"])
        ...             update(where(where(where(table(RDB(), "episode"), "showID", "=", showID),
        ...                                "season", "=", season.season_number), "episode", "=",
        ...                          episode.episode_number),
        ...                    `%`([("airdate", `%`(episode.air_date))]))
        ...     complete(retFuture_53840040)
        ...   let retFutUnown`gensym53840043 = retFuture_53840040
        ...   var nameIterVar`gensym53840044 = anonymousIter_53840041
        ...   proc anonymousNimAsyncContinue_53840042() {.closure.} =
        ...     try:
        ...       if not finished(nameIterVar`gensym53840044):
        ...         var next`gensym53840045 = nameIterVar`gensym53840044()
        ...         while not isNil(next`gensym53840045) and finished(next`gensym53840045):
        ...           next`gensym53840045 = nameIterVar`gensym53840044()
        ...           if finished(nameIterVar`gensym53840044):
        ...             break
        ...         if next`gensym53840045 == nil:
        ...           if not finished(retFutUnown`gensym53840043):
        ...             let msg`gensym53840046 = "Async procedure ($1) yielded `nil`, are you await\'ing a `nil` Future?"
        ...             raise
        ...               (ref AssertionDefect)(msg: msg`gensym53840046 % "anonymous",
        ...                                    parent: nil)
        ...         else:
        ...           {.gcsafe.}:
        ...             {.push, hint[ConvFromXtoItselfNotNeeded]: false.}
        ...             addCallback(next`gensym53840045, cast[proc () {.closure, gcsafe.}](anonymousNimAsyncContinue_53840042))
        ...             {.pop.}
        ...     except:
        ...       if finished(retFutUnown`gensym53840043):
        ...         raise
        ...       else:
        ...         fail(retFutUnown`gensym53840043, getCurrentException())
        ...   
        ...   anonymousNimAsyncContinue_53840042()
        ...   return retFuture_53840040' is of type: proc (): Future[system.void]{.locks: <unknown>.}
        ...   This expression is not GC-safe. Annotate the proc with {.gcsafe.} to get extended error information.
        ... proc initBeater(interval: TimeInterval; threadProc: BeaterThreadProc;
        ...                startTime: Option[DateTime] = none(DateTime);
        ...                endTime: Option[DateTime] = none(DateTime); id: string = "";
        ...                throttleNum: int = 1): Beater
        ...   first type mismatch at position: 6
        ...   unknown named parameter: asyncProc
        ... expression: initBeater(id = "shows", interval = initTimeInterval(0, 0, 0, 0, 0, 0, 1, 0, 0, 0),
        ...            throttleNum = 1, startTime = none(DateTime), endTime = none(DateTime), asyncProc = proc (): owned(
        ...     Future[void]) =
        ...   template await(f`gensym53840047: typed): untyped {.used.} =
        ...     static :
        ...       error "await expects Future[T], got " & $typeof(f`gensym53840047)
        ...   template await[T](f`gensym53840048: Future[T]): auto {.used.} =
        ...     var internalTmpFuture`gensym53840049_53845020: FutureBase = f`gensym53840048
        ...     yield internalTmpFuture`gensym53840049_53845020
        ...     (cast[type(f`gensym53840048)](internalTmpFuture`gensym53840049_53845020)).read()
        ...   var retFuture_53840040 = newFuture("anonymous")
        ...   iterator anonymousIter_53840041(): owned(FutureBase) {.closure.} =
        ...     echo(["updating shows"])
        ...     let account = getAccount()
        ...     for show in items(get(select(table(RDB(), "show"), ["id"]))):
        ...       let showID = getInt(show["id"], 0)
        ...       let showDetails =
        ...         var internalTmpFuture`gensym53840049`gensym53845048: FutureBase = getShowDetails(
        ...             account, showID)
        ...         yield internalTmpFuture`gensym53840049`gensym53845048
        ...         read(cast[type(getShowDetails(account, showID))](internalTmpFuture`gensym53840049`gensym53845048))
        ...       for season in items(showDetails.seasons):
        ...         if season.season_number == 0:
        ...           continue
        ...         let seasonDetails =
        ...           var internalTmpFuture`gensym53840049`gensym53860216: FutureBase = getSeason(
        ...               account, showID, season.season_number)
        ...           yield internalTmpFuture`gensym53840049`gensym53860216
        ...           read(cast[type(getSeason(account, showID, season.season_number))](internalTmpFuture`gensym53840049`gensym53860216))
        ...         for episode in items(seasonDetails.episodes):
        ...           try:
        ...             insert(table(RDB(), "episode"), `%`([("showID", `%`(showDetails.id)),
        ...                 ("season", `%`(season.season_number)),
        ...                 ("episode", `%`(episode.episode_number)), ("id", `%`(episode.id)),
        ...                 ("airdate", `%`(episode.air_date)), ("status", `%`(0))]))
        ...           except:
        ...             echo(["already in db"])
        ...             update(where(where(where(table(RDB(), "episode"), "showID", "=", showID),
        ...                                "season", "=", season.season_number), "episode", "=",
        ...                          episode.episode_number),
        ...                    `%`([("airdate", `%`(episode.air_date))]))
        ...     complete(retFuture_53840040)
        ...   let retFutUnown`gensym53840043 = retFuture_53840040
        ...   var nameIterVar`gensym53840044 = anonymousIter_53840041
        ...   proc anonymousNimAsyncContinue_53840042() {.closure.} =
        ...     try:
        ...       if not finished(nameIterVar`gensym53840044):
        ...         var next`gensym53840045 = nameIterVar`gensym53840044()
        ...         while not isNil(next`gensym53840045) and finished(next`gensym53840045):
        ...           next`gensym53840045 = nameIterVar`gensym53840044()
        ...           if finished(nameIterVar`gensym53840044):
        ...             break
        ...         if next`gensym53840045 == nil:
        ...           if not finished(retFutUnown`gensym53840043):
        ...             let msg`gensym53840046 = "Async procedure ($1) yielded `nil`, are you await\'ing a `nil` Future?"
        ...             raise
        ...               (ref AssertionDefect)(msg: msg`gensym53840046 % "anonymous",
        ...                                    parent: nil)
        ...         else:
        ...           {.gcsafe.}:
        ...             {.push, hint[ConvFromXtoItselfNotNeeded]: false.}
        ...             addCallback(next`gensym53840045, cast[proc () {.closure, gcsafe.}](anonymousNimAsyncContinue_53840042))
        ...             {.pop.}
        ...     except:
        ...       if finished(retFutUnown`gensym53840043):
        ...         raise
        ...       else:
        ...         fail(retFutUnown`gensym53840043, getCurrentException())
        ...   
        ...   anonymousNimAsyncContinue_53840042()
        ...   return retFuture_53840040)

my code is only the code from the readme with a few extra lines, happens when I tried to add it to another project as well

found the issue
the jester part of my code had GC safe errors that I did not see
fixed them and it all worked perfectly