From 53952d8e349f09c11f3943e13a8d70864390eb80 Mon Sep 17 00:00:00 2001 From: Gwilym Kuiper Date: Wed, 21 Jul 2021 20:59:25 +0100 Subject: [PATCH] Add support for reading config data from a toml file --- agb-image-converter/Cargo.lock | 31 ++++++++++ agb-image-converter/Cargo.toml | 4 +- agb-image-converter/src/config.rs | 96 +++++++++++++++++++++++++++++++ agb-image-converter/src/lib.rs | 1 + agb/Cargo.lock | 31 ++++++++++ 5 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 agb-image-converter/src/config.rs diff --git a/agb-image-converter/Cargo.lock b/agb-image-converter/Cargo.lock index 80b05ad..4eeae28 100644 --- a/agb-image-converter/Cargo.lock +++ b/agb-image-converter/Cargo.lock @@ -13,6 +13,8 @@ name = "agb_image_converter" version = "0.4.0" dependencies = [ "image", + "serde", + "toml", "typed-builder", ] @@ -166,6 +168,26 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "serde" +version = "1.0.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "syn" version = "1.0.73" @@ -177,6 +199,15 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "toml" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +dependencies = [ + "serde", +] + [[package]] name = "typed-builder" version = "0.9.0" diff --git a/agb-image-converter/Cargo.toml b/agb-image-converter/Cargo.toml index 8e6889c..cf9ed0b 100644 --- a/agb-image-converter/Cargo.toml +++ b/agb-image-converter/Cargo.toml @@ -8,4 +8,6 @@ description = "Library for converting graphics for use on the Game Boy Advance" [dependencies] image = { version = "0.23.14", default-features = false, features = [ "png", "bmp" ] } -typed-builder = "0.9.0" \ No newline at end of file +typed-builder = "0.9.0" +toml = "0.5.8" +serde = { version = "1.0", features = ["derive"] } \ No newline at end of file diff --git a/agb-image-converter/src/config.rs b/agb-image-converter/src/config.rs new file mode 100644 index 0000000..56017ac --- /dev/null +++ b/agb-image-converter/src/config.rs @@ -0,0 +1,96 @@ +use serde::Deserialize; +use std::collections::HashMap; +use std::fs; + +use crate::{TileSize, Colour}; + +pub fn parse(filename: &str) -> Box { + let config_toml = fs::read_to_string(filename).expect("Failed to read file"); + + let config: ConfigV1 = toml::from_str(&config_toml).expect("Failed to parse file"); + + if config.version != "1.0" { + panic!("Expected version of {} to be 1.0, got {}", filename, config.version); + } + + Box::new(config) +} + +pub trait Config { + fn crate_prefix(&self) -> String; + fn images(&self) -> HashMap; +} + +pub trait Image { + fn filename(&self) -> String; + fn transparent_colour(&self) -> Option; + fn tilesize(&self) -> TileSize; +} + +#[derive(Deserialize)] +pub struct ConfigV1 { + version: String, + crate_prefix: Option, + + image: HashMap, +} + +impl Config for ConfigV1 { + fn crate_prefix(&self) -> String { + self.crate_prefix.clone().unwrap_or("agb".to_owned()) + } + + fn images(&self) -> HashMap { + self.image.iter() + .map(|(filename, image)| ( + filename.clone(), image as &dyn Image + )).collect() + } +} + +#[derive(Deserialize)] +pub struct ImageV1 { + filename: String, + transparent_colour: Option, + tile_size: TileSizeV1, +} + +impl Image for ImageV1 { + fn filename(&self) -> String { + self.filename.clone() + } + + fn transparent_colour(&self) -> Option { + if let Some(colour) = &self.transparent_colour { + if colour.len() != 6 { + panic!("Expected colour to be 6 characters, got {}", colour); + } + + let r = u8::from_str_radix(&colour[0..2], 16).unwrap(); + let g = u8::from_str_radix(&colour[2..4], 16).unwrap(); + let b = u8::from_str_radix(&colour[4..6], 16).unwrap(); + + return Some(Colour::from_rgb(r, g, b)); + } + + None + } + + fn tilesize(&self) -> TileSize { + self.tile_size.into() + } +} + +#[derive(Deserialize, Clone, Copy)] +pub enum TileSizeV1 { + #[serde(rename = "8x8")] + Tile8, +} + +impl Into for TileSizeV1 { + fn into(self) -> TileSize { + match self { + TileSizeV1::Tile8 => TileSize::Tile8, + } + } +} \ No newline at end of file diff --git a/agb-image-converter/src/lib.rs b/agb-image-converter/src/lib.rs index e13ce86..94bb4ee 100644 --- a/agb-image-converter/src/lib.rs +++ b/agb-image-converter/src/lib.rs @@ -8,6 +8,7 @@ mod colour; mod image_loader; mod palette16; mod rust_generator; +mod config; use image_loader::Image; diff --git a/agb/Cargo.lock b/agb/Cargo.lock index 0efcd82..30880c6 100644 --- a/agb/Cargo.lock +++ b/agb/Cargo.lock @@ -21,6 +21,8 @@ name = "agb_image_converter" version = "0.4.0" dependencies = [ "image", + "serde", + "toml", "typed-builder", ] @@ -174,6 +176,26 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "serde" +version = "1.0.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "syn" version = "1.0.73" @@ -185,6 +207,15 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "toml" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +dependencies = [ + "serde", +] + [[package]] name = "typed-builder" version = "0.9.0"