view semicongine/loaders.nim @ 1478:6b389ac08e5e

merge
author sam <sam@basx.dev>
date Sun, 20 Apr 2025 00:33:33 +0700
parents b1130c34ad0c
children
line wrap: on
line source

import std/json
import std/sequtils
import std/streams

import ./audio
import ./background_loaders
import ./core
import ./images
import ./resources
import ./thirdparty/parsetoml

# necessary, so we don't need to import parsetoml extra when using this module
export parsetoml

proc loadBytes*(path, package: string): seq[byte] {.gcsafe.} =
  cast[seq[byte]](toSeq(path.loadResource_intern(package = package).readAll()))

proc loadJson*(path: string, package = DEFAULT_PACKAGE): JsonNode {.gcsafe.} =
  path.loadResource_intern(package = package).readAll().parseJson()

proc loadConfig*(path: string, package = DEFAULT_PACKAGE): TomlValueRef {.gcsafe.} =
  path.loadResource_intern(package = package).parseStream(filename = path)

# background loaders

type ResourceType =
  seq[byte] | JsonNode | TomlValueRef | Image[Gray] | Image[BGRA] | SoundData

proc loadAsync*[T: ResourceType](path: string, package = DEFAULT_PACKAGE) =
  when T is seq[byte]:
    requestLoading(engine().rawLoader[], path, package)
  elif T is JsonNode:
    requestLoading(engine().jsonLoader[], path, package)
  elif T is TomlValueRef:
    requestLoading(engine().configLoader[], path, package)
  elif T is Image[Gray]:
    requestLoading(engine().grayImageLoader[], path, package)
  elif T is Image[BGRA]:
    requestLoading(engine().imageLoader[], path, package)
  elif T is SoundData:
    requestLoading(engine().audioLoader[], path, package)
  else:
    {.error: "Unknown type".}

proc isLoaded*[T: ResourceType](path: string, package = DEFAULT_PACKAGE): bool =
  when T is seq[byte]:
    isLoaded(engine().rawLoader[], path, package)
  elif T is JsonNode:
    isLoaded(engine().jsonLoader[], path, package)
  elif T is TomlValueRef:
    isLoaded(engine().configLoader[], path, package)
  elif T is Image[Gray]:
    isLoaded(engine().grayImageLoader[], path, package)
  elif T is Image[BGRA]:
    isLoaded(engine().imageLoader[], path, package)
  elif T is SoundData:
    isLoaded(engine().audioLoader[], path, package)
  else:
    {.error: "Unknown type".}

proc getLoaded*[T: ResourceType](path: string, package = DEFAULT_PACKAGE): T =
  when T is seq[byte]:
    getLoadedData(engine().rawLoader[], path, package)
  elif T is JsonNode:
    getLoadedData(engine().jsonLoader[], path, package)
  elif T is TomlValueRef:
    getLoadedData(engine().configLoader[], path, package)
  elif T is Image[Gray]:
    getLoadedData(engine().grayImageLoader[], path, package)
  elif T is Image[BGRA]:
    getLoadedData(engine().imageLoader[], path, package)
  elif T is SoundData:
    getLoadedData(engine().audioLoader[], path, package)
  else:
    {.error: "Unknown type".}