goods 0.4.0

Asset manager for good assets
Documentation

Goods

Easy-to-use asset manager for many environments.

crates docs License

Goals

This crate is written with following goals in mind:

  • Batteries included.
    Crate comes with variety of simple data sources like FileSource and HttpSource. Few Formats based on serde are included under feature flags.

  • Extensibility.
    Multiple Format traits can be implemented for any asset type, including foreign asset types.
    For example JsonFormat, YamlFormat and RonFormat (bundled in the crate) implement Format trait for any asset type which intermediate representation implements serde::de::DeserializeOwned.

  • Supporting WebAssembly.
    All mandatory dependencies are WASM-compatible and no threading is required for asset loading to work.

  • Working with asynchronous data sources.
    All data sources implement Source trait. Source::read method returns future that will be driven to completion by the bound Loader.

  • no_std
    alloc is required.

  • Fast compilation.
    build after cargo clean takes ~3s.

Non-Goals

This crate is not aimed to support every possible feature. Here's list of some of those features:

  • Hot-reloading
    Currently there are no plans to support hot-reloading.

Features

All out-of-the-box functionality execut core traits and types are enabled with features.

General

  • std - adds implementation of std::error::Error trait for error types. Enabled by default.
  • sync - makes most types Send and some Sync. Adds requirements for traits implementations to be Send and Sync where needed. Enabled by default.

Sources

  • fs (enables std) - adds FileSource - Source implementation that loads asset bytes from file-system.
  • reqwest - adds ReqwestSource - Source implementation that loads asset bytes from URLs using reqwest. Using this source requires Loader to be polled by tokio. Otherwise reqwest interals will panic.
  • fetch - adds FetchSource that uses browser's Fetch API to load assets data. Conflicts with sync feature.

Formats

  • json-format - adds Format implementation that treats asset bytes as JSON document and deserializes asset representation via serde
  • yaml-format - adds Format implementation that treats asset bytes as YAML document and deserializes asset representation via serde
  • ron-format - adds Format implementation that treats asset bytes as RON document and deserializes asset representation via serde

Spawners

  • futures-spawn - adds Spawn implementation for futures_task::Spawn(aka futures::task::Spawn) allowing to use compatible spawners to drive loading tasks to completion.
  • wasm-bindgen-spawn - adds Spawn implementations that uses wasm_bindgen_futures::spawn_local to drive loadin tasks. Usable only on wasm32 target.
  • tokio-spawn - adds Spawn implementation for tokio::runtime::Handle wrapper allowing tokio to drive loading tasks. reqwest based source requires tokio runtime.

Examples

There are few simple examples provided already.

fs examlple

Shows how to build registry with FileSource and load simple assets from it.

reqwest example

Async example that loads assets using HTTP protocol with tokio and reqwest crates.

legion example

Shows how to load assets directly into entity using legion ECS crate.

fetch example

Shows how to load assets in browser using Fetch API.

This example can be built using build-wasm32.sh or build-wasm32.bat in examples directory.
wasm-bindgen (compatible version) and wasm-opt must be in PATH

cd examples

build-wasm32 fetch --features fetch,json-format,yaml-format,wasm-spawn

python3 server.py

Then open http://localhost:8000/fetch Loaded assets must be shown on the page. Otherwise see for errors in log.

Gotchas

  • Currently asyn/await doesn't work with no_std on stable
  • sync is conflicts with fetch feature. But in general sync is not necessary when targeting web browser.

License

This repository is licensed under either of

at your option.

Contribution Licensing

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.