@@ -41,16 +41,21 @@ async fn read_bms_file(file: &Path) -> io::Result<Vec<u8>> {
4141}
4242
4343/// 仅负责解析 BMS 字节(CPU 密集,单线程执行)
44- fn parse_bms_bytes ( bytes : & [ u8 ] ) -> BmsOutput {
44+ fn parse_bms_bytes ( bytes : & [ u8 ] ) -> io :: Result < BmsOutput > {
4545 let ( str, _encoding, _has_error) = encoding_rs:: SHIFT_JIS . decode ( bytes) ;
46- parse_bms ( & str)
46+ let config = bms_rs:: bms:: ParseConfig :: < ( ) , ( ) , ( ) > :: default ( )
47+ . key_mapper :: < bms_rs:: bms:: command:: channel:: mapper:: KeyLayoutBeat > ( )
48+ . prompter ( bms_rs:: bms:: parse:: prompt:: AlwaysWarnAndUseNewer )
49+ . rng ( bms_rs:: bms:: rng:: JavaRandom :: default ( ) )
50+ . use_common ( ) ;
51+ parse_bms ( & str, config) . map_err ( io:: Error :: other)
4752}
4853
4954/// 包装:读取 + 解析
5055pub async fn parse_bms_file ( file : & Path ) -> io:: Result < BmsOutput > {
5156 let bytes = read_bms_file ( file) . await ?;
5257 // 解析阶段保持单线程(不在此处并发)
53- Ok ( parse_bms_bytes ( & bytes) )
58+ parse_bms_bytes ( & bytes)
5459}
5560
5661/// 仅负责读取 BMSON 文件(异步 IO)
@@ -135,10 +140,7 @@ pub async fn get_dir_bms_list(dir: &Path) -> io::Result<Vec<BmsOutput>> {
135140 // Stage 2: 解析(CPU 密集,受限并发)
136141 . map ( |pending| async move {
137142 let parsed: io:: Result < BmsOutput > = match pending {
138- PendingParse :: Bms ( bytes) => {
139- let r = unblock ( move || parse_bms_bytes ( & bytes) ) . await ;
140- Ok ( r)
141- }
143+ PendingParse :: Bms ( bytes) => unblock ( move || parse_bms_bytes ( & bytes) ) . await ,
142144 PendingParse :: Bmson ( bytes) => unblock ( move || parse_bmson_bytes ( & bytes) ) . await ,
143145 } ;
144146 if let Ok ( out) = parsed {
@@ -172,13 +174,13 @@ pub async fn get_dir_bms_info(dir: &Path) -> io::Result<Option<Bms>> {
172174 // Header
173175 let titles: Vec < _ > = bms_list
174176 . iter ( )
175- . filter_map ( |BmsOutput { bms, .. } | bms. header . title . as_deref ( ) )
177+ . filter_map ( |BmsOutput { bms, .. } | bms. music_info . title . as_deref ( ) )
176178 . collect ( ) ;
177179 let title = extract_work_name ( titles. as_slice ( ) , true , & [ ] ) ;
178- bms. header . title = Some ( title) ;
180+ bms. music_info . title = Some ( title) ;
179181 let artists: Vec < _ > = bms_list
180182 . iter ( )
181- . filter_map ( |BmsOutput { bms, .. } | bms. header . artist . as_deref ( ) )
183+ . filter_map ( |BmsOutput { bms, .. } | bms. music_info . artist . as_deref ( ) )
182184 . collect ( ) ;
183185 let artist = extract_work_name (
184186 artists. as_slice ( ) ,
@@ -187,27 +189,26 @@ pub async fn get_dir_bms_info(dir: &Path) -> io::Result<Option<Bms>> {
187189 "/" , ":" , ":" , "-" , "obj" , "obj." , "Obj" , "Obj." , "OBJ" , "OBJ." ,
188190 ] ,
189191 ) ;
190- bms. header . artist = Some ( artist) ;
192+ bms. music_info . artist = Some ( artist) ;
191193 let genres: Vec < _ > = bms_list
192194 . iter ( )
193- . filter_map ( |BmsOutput { bms, .. } | bms. header . genre . as_deref ( ) )
195+ . filter_map ( |BmsOutput { bms, .. } | bms. music_info . genre . as_deref ( ) )
194196 . collect ( ) ;
195197 let genre = extract_work_name ( genres. as_slice ( ) , true , & [ ] ) ;
196- bms. header . genre = Some ( genre) ;
198+ bms. music_info . genre = Some ( genre) ;
197199 // Defines
198- bms. notes . wav_files = bms_list
200+ bms. wav . wav_files = bms_list
199201 . iter ( )
200202 . fold ( HashMap :: new ( ) , |mut map, BmsOutput { bms, .. } | {
201- map. extend ( bms. notes . wav_files . clone ( ) ) ;
203+ map. extend ( bms. wav . wav_files . clone ( ) ) ;
204+ map
205+ } ) ;
206+ bms. bmp . bmp_files = bms_list
207+ . iter ( )
208+ . fold ( HashMap :: new ( ) , |mut map, BmsOutput { bms, .. } | {
209+ map. extend ( bms. bmp . bmp_files . clone ( ) ) ;
202210 map
203211 } ) ;
204- bms. graphics . bmp_files =
205- bms_list
206- . iter ( )
207- . fold ( HashMap :: new ( ) , |mut map, BmsOutput { bms, .. } | {
208- map. extend ( bms. graphics . bmp_files . clone ( ) ) ;
209- map
210- } ) ;
211212 Ok ( Some ( bms) )
212213}
213214
0 commit comments