riichi_hand 0.7.0

A collection of utilities for working with Riichi Mahjong player hands
Documentation
use image::{ImageFormat, RgbaImage};

macro_rules! load_tile_map {
    ($path:expr, $tile_set_name:literal) => {{
        let mut map = HashMap::with_capacity(ALL_TILES.len());
        load_tile!(map, AKADORA_MAN, $path, $tile_set_name, "Man5-Dora");
        load_tile!(map, II_MAN, $path, $tile_set_name, "Man1");
        load_tile!(map, RYAN_MAN, $path, $tile_set_name, "Man2");
        load_tile!(map, SAN_MAN, $path, $tile_set_name, "Man3");
        load_tile!(map, SUU_MAN, $path, $tile_set_name, "Man4");
        load_tile!(map, UU_MAN, $path, $tile_set_name, "Man5");
        load_tile!(map, ROU_MAN, $path, $tile_set_name, "Man6");
        load_tile!(map, CHII_MAN, $path, $tile_set_name, "Man7");
        load_tile!(map, PAA_MAN, $path, $tile_set_name, "Man8");
        load_tile!(map, KYUU_MAN, $path, $tile_set_name, "Man9");
        load_tile!(map, AKADORA_PIN, $path, $tile_set_name, "Pin5-Dora");
        load_tile!(map, II_PIN, $path, $tile_set_name, "Pin1");
        load_tile!(map, RYAN_PIN, $path, $tile_set_name, "Pin2");
        load_tile!(map, SAN_PIN, $path, $tile_set_name, "Pin3");
        load_tile!(map, SUU_PIN, $path, $tile_set_name, "Pin4");
        load_tile!(map, UU_PIN, $path, $tile_set_name, "Pin5");
        load_tile!(map, ROU_PIN, $path, $tile_set_name, "Pin6");
        load_tile!(map, CHII_PIN, $path, $tile_set_name, "Pin7");
        load_tile!(map, PAA_PIN, $path, $tile_set_name, "Pin8");
        load_tile!(map, KYUU_PIN, $path, $tile_set_name, "Pin9");
        load_tile!(map, AKADORA_SOU, $path, $tile_set_name, "Sou5-Dora");
        load_tile!(map, II_SOU, $path, $tile_set_name, "Sou1");
        load_tile!(map, RYAN_SOU, $path, $tile_set_name, "Sou2");
        load_tile!(map, SAN_SOU, $path, $tile_set_name, "Sou3");
        load_tile!(map, SUU_SOU, $path, $tile_set_name, "Sou4");
        load_tile!(map, UU_SOU, $path, $tile_set_name, "Sou5");
        load_tile!(map, ROU_SOU, $path, $tile_set_name, "Sou6");
        load_tile!(map, CHII_SOU, $path, $tile_set_name, "Sou7");
        load_tile!(map, PAA_SOU, $path, $tile_set_name, "Sou8");
        load_tile!(map, KYUU_SOU, $path, $tile_set_name, "Sou9");
        load_tile!(map, TON, $path, $tile_set_name, "Ton");
        load_tile!(map, NAN, $path, $tile_set_name, "Nan");
        load_tile!(map, SHAA, $path, $tile_set_name, "Shaa");
        load_tile!(map, PEI, $path, $tile_set_name, "Pei");
        load_tile!(map, HAKU, $path, $tile_set_name, "Haku");
        load_tile!(map, HATSU, $path, $tile_set_name, "Hatsu");
        load_tile!(map, CHUN, $path, $tile_set_name, "Chun");
        load_tile!(map, ANY, $path, $tile_set_name, "Back");
        map
    }};
}

macro_rules! load_tile {
    ($map:expr, $tile:expr, $path:expr, $tile_set_name:literal, $tile_name:literal) => {
        $map.insert($tile, load_tile_image!($path, $tile_set_name, $tile_name));
    };
}

macro_rules! load_tile_image {
    ($path:expr, $tile_set_name:literal, $tile_name:literal) => {
        load_png_from_memory(include_bytes!(concat!(
            $path,
            $tile_set_name,
            "/",
            $tile_name,
            ".png"
        )))
    };
}

pub(super) fn load_png_from_memory(buf: &[u8]) -> RgbaImage {
    image::load_from_memory_with_format(buf, ImageFormat::Png)
        .expect("could not load image")
        .to_rgba8()
}

pub(super) use {load_tile, load_tile_image, load_tile_map};