@@ -34,6 +34,7 @@ pub trait ChunkProcessor {
3434#[ derive( Debug , Clone ) ]
3535pub enum BadSequence {
3636 MissingCharClassName ,
37+ InvalidCharClass ( String ) ,
3738 MissingEquivalentClassChar ,
3839 MultipleCharRepeatInSet2 ,
3940 CharRepeatInSet1 ,
@@ -53,6 +54,13 @@ impl Display for BadSequence {
5354 Self :: MissingCharClassName => {
5455 write ! ( f, "{}" , translate!( "tr-error-missing-char-class-name" ) )
5556 }
57+ Self :: InvalidCharClass ( class) => {
58+ write ! (
59+ f,
60+ "{}" ,
61+ translate!( "tr-error-invalid-char-class" , "class" => format!( "'{}'" , class) )
62+ )
63+ }
5664 Self :: MissingEquivalentClassChar => {
5765 write ! (
5866 f,
@@ -499,31 +507,32 @@ impl Sequence {
499507 }
500508
501509 fn parse_class ( input : & [ u8 ] ) -> IResult < & [ u8 ] , Result < Self , BadSequence > > {
502- delimited (
503- tag ( "[:" ) ,
504- alt ( (
505- map (
506- alt ( (
507- value ( Self :: Class ( Class :: Alnum ) , tag ( "alnum" ) ) ,
508- value ( Self :: Class ( Class :: Alpha ) , tag ( "alpha" ) ) ,
509- value ( Self :: Class ( Class :: Blank ) , tag ( "blank" ) ) ,
510- value ( Self :: Class ( Class :: Control ) , tag ( "cntrl" ) ) ,
511- value ( Self :: Class ( Class :: Digit ) , tag ( "digit" ) ) ,
512- value ( Self :: Class ( Class :: Graph ) , tag ( "graph" ) ) ,
513- value ( Self :: Class ( Class :: Lower ) , tag ( "lower" ) ) ,
514- value ( Self :: Class ( Class :: Print ) , tag ( "print" ) ) ,
515- value ( Self :: Class ( Class :: Punct ) , tag ( "punct" ) ) ,
516- value ( Self :: Class ( Class :: Space ) , tag ( "space" ) ) ,
517- value ( Self :: Class ( Class :: Upper ) , tag ( "upper" ) ) ,
518- value ( Self :: Class ( Class :: Xdigit ) , tag ( "xdigit" ) ) ,
519- ) ) ,
520- Ok ,
521- ) ,
522- value ( Err ( BadSequence :: MissingCharClassName ) , tag ( "" ) ) ,
523- ) ) ,
524- tag ( ":]" ) ,
525- )
526- . parse ( input)
510+ preceded ( tag ( "[:" ) , terminated ( take_until ( ":]" ) , tag ( ":]" ) ) )
511+ . parse ( input)
512+ . map ( |( l, class_name) | {
513+ (
514+ l,
515+ match class_name {
516+ b"" => Err ( BadSequence :: MissingCharClassName ) ,
517+ b"alnum" => Ok ( Self :: Class ( Class :: Alnum ) ) ,
518+ b"alpha" => Ok ( Self :: Class ( Class :: Alpha ) ) ,
519+ b"blank" => Ok ( Self :: Class ( Class :: Blank ) ) ,
520+ b"cntrl" => Ok ( Self :: Class ( Class :: Control ) ) ,
521+ b"digit" => Ok ( Self :: Class ( Class :: Digit ) ) ,
522+ b"graph" => Ok ( Self :: Class ( Class :: Graph ) ) ,
523+ b"lower" => Ok ( Self :: Class ( Class :: Lower ) ) ,
524+ b"print" => Ok ( Self :: Class ( Class :: Print ) ) ,
525+ b"punct" => Ok ( Self :: Class ( Class :: Punct ) ) ,
526+ b"space" => Ok ( Self :: Class ( Class :: Space ) ) ,
527+ b"upper" => Ok ( Self :: Class ( Class :: Upper ) ) ,
528+ b"xdigit" => Ok ( Self :: Class ( Class :: Xdigit ) ) ,
529+ _ => Err ( BadSequence :: InvalidCharClass ( format ! (
530+ "[:{}:]" ,
531+ String :: from_utf8_lossy( class_name)
532+ ) ) ) ,
533+ } ,
534+ )
535+ } )
527536 }
528537
529538 fn parse_char_equal ( input : & [ u8 ] ) -> IResult < & [ u8 ] , Result < Self , BadSequence > > {
0 commit comments