micro_ldtk 0.17.1

Load data from LDTK, index it and make it accessible through Bevy assets, extract and use autotile rules
Documentation
#[cfg(feature = "bevy")]
use bevy_app::App;
#[cfg(feature = "bevy")]
use bevy_asset::{AssetPlugin, AssetServer};
#[cfg(feature = "bevy")]
use bevy_asset::{Handle, LoadState};
#[cfg(feature = "bevy")]
use bevy_ecs::prelude::{Res, ResMut};
#[cfg(feature = "bevy")]
use bevy_ecs::resource::Resource;
#[cfg(feature = "bevy")]
use bevy_ecs::system::RunSystemOnce;
#[cfg(feature = "bevy")]
use bevy_internal::MinimalPlugins;
use micro_ldtk::ldtk::Project;

#[derive(Default, Resource)]
#[cfg(feature = "bevy")]
pub struct LevelHandle(Handle<Project>);

macro_rules! test_loads_assets {
	($file_name: literal = $cfg_version: literal) => {
		#[test]
		#[cfg(all(feature = "bevy", feature = $cfg_version))]
		fn loads_ldtk_file() {
			static ASSET_PATH: &str = $file_name;

			let mut app = App::new();
			app.init_resource::<LevelHandle>()
				.add_plugins((MinimalPlugins, AssetPlugin::default()));

			app.add_plugins(micro_ldtk::MicroLDTKPlugin);
			app.update();

			app.world_mut()
				.run_system_once(
					|assets: Res<AssetServer>, mut handle: ResMut<LevelHandle>| {
						*handle = LevelHandle(assets.load(ASSET_PATH))
					},
				)
				.expect("Failed to load LDTK file");
			app.update();

			let mut status: LoadState = app
				.world_mut()
				.run_system_once(|assets: Res<AssetServer>, handle: Res<LevelHandle>| {
					assets
						.get_load_state(handle.0.id())
						.expect("Unable to get load state")
				})
				.expect("Failed to get load state");

			while matches!(status, LoadState::Loading) {
				status = app
					.world_mut()
					.run_system_once(|assets: Res<AssetServer>, handle: Res<LevelHandle>| {
						assets
							.get_load_state(handle.0.id())
							.expect("Unable to get load state")
					})
					.expect("Failed to get load state");
			}

			if !status.is_loaded() {
				panic!("Failed to load LDTK file: {:?}", status);
			}
		}
	};
}

test_loads_assets!("ldtk_v1_0_0.ldtk" = "ldtk_1_0_0");
test_loads_assets!("ldtk_v1_1_0.ldtk" = "ldtk_1_1_0");
test_loads_assets!("ldtk_v1_1_1.ldtk" = "ldtk_1_1_1");
test_loads_assets!("ldtk_v1_1_2.ldtk" = "ldtk_1_1_2");
test_loads_assets!("ldtk_v1_2_0.ldtk" = "ldtk_1_2_0");
test_loads_assets!("ldtk_v1_2_1.ldtk" = "ldtk_1_2_1");
test_loads_assets!("ldtk_v1_2_2.ldtk" = "ldtk_1_2_2");
test_loads_assets!("ldtk_v1_2_3.ldtk" = "ldtk_1_2_3");
test_loads_assets!("ldtk_v1_2_4.ldtk" = "ldtk_1_2_4");
test_loads_assets!("ldtk_v1_2_5.ldtk" = "ldtk_1_2_5");
test_loads_assets!("ldtk_v1_3_0.ldtk" = "ldtk_1_3_0");
test_loads_assets!("ldtk_v1_4_0.ldtk" = "ldtk_1_4_0");
test_loads_assets!("ldtk_v1_4_1.ldtk" = "ldtk_1_4_1");
test_loads_assets!("ldtk_v1_5_3.ldtk" = "ldtk_1_5_3");