1+ use std:: fmt:: Display ;
2+
13use ratatui:: {
24 Frame ,
35 layout:: { Constraint , Direction , Layout , Margin , Rect } ,
46 style:: { Style , Stylize } ,
57 widgets:: { Block , Cell , Padding , Row , Table } ,
68} ;
79
8- use crate :: dmi:: Release ;
10+ #[ derive( Debug ) ]
11+ pub struct Release {
12+ pub major : u8 ,
13+ pub minor : u8 ,
14+ }
15+
16+ impl Release {
17+ fn new ( major : u8 , minor : u8 ) -> Self {
18+ Self { major, minor }
19+ }
20+ }
21+
22+ impl Display for Release {
23+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
24+ write ! ( f, "{}.{}" , self . major, self . minor)
25+ }
26+ }
27+
28+ #[ derive( Debug ) ]
29+ pub struct LanguageInfos {
30+ installed_languages : u8 ,
31+ abbreviated_format_is_used : bool ,
32+ current_language : String ,
33+ }
34+
35+ impl From < ( Vec < u8 > , Vec < String > ) > for LanguageInfos {
36+ fn from ( ( data, text) : ( Vec < u8 > , Vec < String > ) ) -> Self {
37+ Self {
38+ installed_languages : data[ 0 ] ,
39+ abbreviated_format_is_used : data[ 1 ] << 1 != 0 ,
40+ current_language : text[ data[ 17 ] . saturating_sub ( 1 ) as usize ] . clone ( ) ,
41+ }
42+ }
43+ }
944
1045#[ derive( Debug ) ]
1146pub struct Firmware {
@@ -18,6 +53,7 @@ pub struct Firmware {
1853 pub firmware_characteristics_exentions : FirmwareCharacteristicsExtension ,
1954 pub platform_firmware_release : Release ,
2055 pub embedded_controller_firmware_release : Release ,
56+ pub language_infos : Option < LanguageInfos > ,
2157}
2258
2359impl From < ( Vec < u8 > , Vec < String > , u8 ) > for Firmware {
@@ -55,6 +91,7 @@ impl From<(Vec<u8>, Vec<String>, u8)> for Firmware {
5591 ] ) ,
5692 platform_firmware_release : Release :: new ( data[ 16 ] , data[ 17 ] ) ,
5793 embedded_controller_firmware_release : Release :: new ( data[ 18 ] , data[ 19 ] ) ,
94+ language_infos : None ,
5895 }
5996 }
6097}
@@ -99,6 +136,41 @@ impl Firmware {
99136 Cell :: from( "Firmware ROM size" ) . bold( ) ,
100137 Cell :: from( self . firmware_rom_size. clone( ) ) ,
101138 ] ) ,
139+ Row :: new( vec![
140+ Cell :: from( "Installable Languages" ) . bold( ) ,
141+ Cell :: from(
142+ self . language_infos
143+ . as_ref( )
144+ . unwrap( )
145+ . installed_languages
146+ . to_string( ) ,
147+ ) ,
148+ ] ) ,
149+ Row :: new( vec![
150+ Cell :: from( "Language Description Format" ) . bold( ) ,
151+ Cell :: from(
152+ if self
153+ . language_infos
154+ . as_ref( )
155+ . unwrap( )
156+ . abbreviated_format_is_used
157+ {
158+ "Abbreviated" . to_string( )
159+ } else {
160+ "Long format" . to_string( )
161+ } ,
162+ ) ,
163+ ] ) ,
164+ Row :: new( vec![
165+ Cell :: from( "Current Language" ) . bold( ) ,
166+ Cell :: from(
167+ self . language_infos
168+ . as_ref( )
169+ . unwrap( )
170+ . current_language
171+ . clone( ) ,
172+ ) ,
173+ ] ) ,
102174 ] ;
103175 let widths = [ Constraint :: Length ( 40 ) , Constraint :: Fill ( 1 ) ] ;
104176 let table = Table :: new ( rows, widths) . block ( Block :: new ( ) . padding ( Padding :: uniform ( 2 ) ) ) ;
0 commit comments