Skip to content

Commit a562512

Browse files
committed
Add conversion from Vec<u8> to Palette
1 parent f569221 commit a562512

File tree

5 files changed

+124
-49
lines changed

5 files changed

+124
-49
lines changed

Cargo.lock

+56
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ authors = ["pecet"]
66
build = "build.rs"
77

88
[dependencies]
9+
anyhow = { version = "1.0.79", features = ["backtrace"] }
910
chrono = "0.4"
1011
clap = { version = "4.4", features = ["derive"] }
1112
colored = "2.1"
@@ -19,3 +20,4 @@ log = "0.4"
1920
png = "0.17.11"
2021
rayon = "1.8.0"
2122
tera = "1.19.1"
23+
thiserror = "1.0.56"

src/image_handler.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ impl ImageHandler {
153153
merge_layout: MergeLayout,
154154
) {
155155
debug!("Opening palette file {}", pal_file);
156-
let palette = Palette::load(pal_file);
156+
let palette = Palette::load(pal_file).unwrap();
157157
let palette_colors: HashMap<String, Color> = palette.into();
158158

159159
let template = Palette::default();

src/main.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,10 @@ fn main() {
5353
display_type,
5454
pal_file_name,
5555
} => {
56-
let palette = Palette::load(&pal_file_name);
56+
let palette = Palette::load(&pal_file_name)
57+
.unwrap_or_else(|err| {
58+
panic!("Cannot load palette: {err}")
59+
});
5760
debug!("Loaded palette:\n{:?}", &palette);
5861
info!(
5962
"Palette as ANSI 24-bit colored strings:\n{}",

src/palette.rs

+61-47
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,25 @@ use colored::*;
33
use log::{debug, error, info};
44
use std::collections::{HashMap, HashSet};
55
use std::fmt::{Display, Formatter};
6-
use std::fs;
6+
use std::{fs, io};
7+
use std::backtrace::Backtrace;
78
use std::fs::File;
89
use std::io::Write;
10+
use thiserror::Error;
911
use crate::png_helper::PngPalette;
1012

13+
#[derive(Error, Debug)]
14+
pub enum Error {
15+
#[error("Cannot convert from Palette to Vec<u8>")]
16+
GenericConversionError,
17+
#[error("Invalid palette data size, must be exactly 56 bytes, but is {0}")]
18+
InvalidSize(usize),
19+
#[error("Incorrect footer")]
20+
IncorrectFooter,
21+
#[error("Error while reading file {0}")]
22+
IoError(#[from] io::Error),
23+
}
24+
1125
pub type Color = [u8; 3];
1226
pub type Colors = [Color; 4];
1327
#[derive(Debug, Clone)]
@@ -21,7 +35,6 @@ pub struct Palette {
2135

2236
impl From<Palette> for Vec<u8> {
2337
fn from(value: Palette) -> Self {
24-
let array: [u8; 51] = [255; 51];
2538
let all_colors: Vec<Colors> = vec![value.bg, value.obj0, value.obj1, value.window];
2639
let mut all_color: Vec<Color> = all_colors.into_iter().flatten().collect();
2740
all_color.push(value.lcd_off);
@@ -30,6 +43,49 @@ impl From<Palette> for Vec<u8> {
3043
}
3144
}
3245

46+
macro_rules! data_to_array {
47+
($data: ident, $start: expr) => {
48+
$data[$start..$start + 3]
49+
.try_into()
50+
.expect("Cannot convert vec to fixed size array")
51+
};
52+
}
53+
54+
macro_rules! data_to_multi_array {
55+
($data: ident, $start: literal) => {
56+
[
57+
data_to_array!($data, $start),
58+
data_to_array!($data, $start + 3),
59+
data_to_array!($data, $start + 6),
60+
data_to_array!($data, $start + 9),
61+
]
62+
};
63+
}
64+
65+
impl TryFrom<Vec<u8>> for Palette {
66+
type Error = Error;
67+
fn try_from(value: Vec<u8>) -> Result<Self, Self::Error> {
68+
if value.len() != 56 {
69+
return Err(Error::InvalidSize(value.len()));
70+
}
71+
if !(value[51] == 0x81
72+
&& value[52] == 0x41
73+
&& value[53] == 0x50
74+
&& value[54] == 0x47
75+
&& value[55] == 0x42)
76+
{
77+
return Err(Error::IncorrectFooter);
78+
}
79+
Ok(Self {
80+
bg: data_to_multi_array!(value, 0),
81+
obj0: data_to_multi_array!(value, 12),
82+
obj1: data_to_multi_array!(value, 24),
83+
window: data_to_multi_array!(value, 36),
84+
lcd_off: data_to_array!(value, 48),
85+
})
86+
}
87+
}
88+
3389
impl Default for Palette {
3490
fn default() -> Self {
3591
Self {
@@ -125,54 +181,12 @@ impl AsAnsiVec for Colors {
125181
}
126182
}
127183

128-
macro_rules! data_to_array {
129-
($data: ident, $start: expr) => {
130-
$data[$start..$start + 3]
131-
.try_into()
132-
.expect("Cannot convert vec to fixed size array")
133-
};
134-
}
135-
136-
macro_rules! data_to_multi_array {
137-
($data: ident, $start: literal) => {
138-
[
139-
data_to_array!($data, $start),
140-
data_to_array!($data, $start + 3),
141-
data_to_array!($data, $start + 6),
142-
data_to_array!($data, $start + 9),
143-
]
144-
};
145-
}
146184
impl Palette {
147185
/// Load palette from file
148-
pub fn load(file_name: &str) -> Self {
186+
pub fn load(file_name: &str) -> Result<Self, Error> {
149187
debug!("Loading palette from {}", file_name);
150-
let data = fs::read(file_name).expect("Cannot read palette file");
151-
if data.len() != 56 {
152-
panic!(
153-
"Palette file should have exactly 56 bytes, but it has {} bytes",
154-
data.len()
155-
);
156-
}
157-
// check footer
158-
if data[51] == 0x81
159-
&& data[52] == 0x41
160-
&& data[53] == 0x50
161-
&& data[54] == 0x47
162-
&& data[55] == 0x42
163-
{
164-
debug!("Footer of palette file is correct");
165-
} else {
166-
error!("Footer of palette file is incorrect, will try to read anyway")
167-
}
168-
info!("Palette from {} loaded", file_name);
169-
Self {
170-
bg: data_to_multi_array!(data, 0),
171-
obj0: data_to_multi_array!(data, 12),
172-
obj1: data_to_multi_array!(data, 24),
173-
window: data_to_multi_array!(data, 36),
174-
lcd_off: data_to_array!(data, 48),
175-
}
188+
let data = fs::read(file_name)?;
189+
data.try_into()
176190
}
177191

178192
pub fn save(&self, file_name: &str) {

0 commit comments

Comments
 (0)