@@ -3,11 +3,25 @@ use colored::*;
3
3
use log:: { debug, error, info} ;
4
4
use std:: collections:: { HashMap , HashSet } ;
5
5
use std:: fmt:: { Display , Formatter } ;
6
- use std:: fs;
6
+ use std:: { fs, io} ;
7
+ use std:: backtrace:: Backtrace ;
7
8
use std:: fs:: File ;
8
9
use std:: io:: Write ;
10
+ use thiserror:: Error ;
9
11
use crate :: png_helper:: PngPalette ;
10
12
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
+
11
25
pub type Color = [ u8 ; 3 ] ;
12
26
pub type Colors = [ Color ; 4 ] ;
13
27
#[ derive( Debug , Clone ) ]
@@ -21,7 +35,6 @@ pub struct Palette {
21
35
22
36
impl From < Palette > for Vec < u8 > {
23
37
fn from ( value : Palette ) -> Self {
24
- let array: [ u8 ; 51 ] = [ 255 ; 51 ] ;
25
38
let all_colors: Vec < Colors > = vec ! [ value. bg, value. obj0, value. obj1, value. window] ;
26
39
let mut all_color: Vec < Color > = all_colors. into_iter ( ) . flatten ( ) . collect ( ) ;
27
40
all_color. push ( value. lcd_off ) ;
@@ -30,6 +43,49 @@ impl From<Palette> for Vec<u8> {
30
43
}
31
44
}
32
45
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
+
33
89
impl Default for Palette {
34
90
fn default ( ) -> Self {
35
91
Self {
@@ -125,54 +181,12 @@ impl AsAnsiVec for Colors {
125
181
}
126
182
}
127
183
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
- }
146
184
impl Palette {
147
185
/// Load palette from file
148
- pub fn load ( file_name : & str ) -> Self {
186
+ pub fn load ( file_name : & str ) -> Result < Self , Error > {
149
187
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 ( )
176
190
}
177
191
178
192
pub fn save ( & self , file_name : & str ) {
0 commit comments