1- use crate :: parser:: numeric;
1+ use crate :: { backend :: errors :: backend_error :: BackendError , parser:: numeric, traceln } ;
22use std:: cmp:: max;
33
44#[ derive( Debug , PartialEq , Clone ) ]
@@ -14,14 +14,18 @@ pub enum TabElement3 {
1414 Vibrato ,
1515}
1616
17+ #[ derive( Debug ) ]
18+ pub enum TabElementError {
19+ FretTooLarge ,
20+ }
1721#[ inline( always) ]
18- pub fn tab_element3 ( s : & str ) -> Result < ( & str , TabElement3 ) , & str > {
22+ pub fn tab_element3 ( s : & str ) -> Result < ( & str , TabElement3 ) , ( & str , Option < TabElementError > ) > {
1923 let bytes = s. as_bytes ( ) ;
2024 match bytes. first ( ) {
2125 Some ( b'-' ) => Ok ( ( & s[ 1 ..] , TabElement3 :: Rest ) ) ,
2226 Some ( b'x' ) => Ok ( ( & s[ 1 ..] , TabElement3 :: DeadNote ) ) ,
2327 Some ( 48 ..=58 ) => {
24- let ( res, num) = numeric ( s) ?;
28+ let ( res, num) = numeric ( s) . map_err ( |s| ( s , Some ( TabElementError :: FretTooLarge ) ) ) ?;
2529 Ok ( ( res, TabElement3 :: Fret ( num) ) )
2630 }
2731 Some ( b'b' ) => Ok ( ( & s[ 1 ..] , TabElement3 :: Bend ) ) ,
@@ -30,7 +34,7 @@ pub fn tab_element3(s: &str) -> Result<(&str, TabElement3), &str> {
3034 Some ( b'r' ) => Ok ( ( & s[ 1 ..] , TabElement3 :: Release ) ) ,
3135 Some ( b'/' ) | Some ( b'\\' ) => Ok ( ( & s[ 1 ..] , TabElement3 :: Slide ) ) ,
3236 Some ( b'~' ) => Ok ( ( & s[ 1 ..] , TabElement3 :: Vibrato ) ) ,
33- Some ( _) | None => Err ( s ) ,
37+ Some ( _) | None => Err ( ( s , None ) ) ,
3438 }
3539}
3640impl TabElement3 {
0 commit comments