@@ -80,12 +80,106 @@ impl EscapeError {
8080 }
8181}
8282
83+ /// Takes the contents of a literal (without quotes)
84+ /// and produces a sequence of errors,
85+ /// which are returned by invoking `error_callback`.
86+ pub fn unescape_for_errors (
87+ src : & str ,
88+ mode : Mode ,
89+ mut error_callback : impl FnMut ( Range < usize > , EscapeError ) ,
90+ ) {
91+ match mode {
92+ Char => {
93+ let mut chars = src. chars ( ) ;
94+ if let Err ( e) = unescape_char_or_byte ( & mut chars, Mode :: Char ) {
95+ error_callback ( 0 ..( src. len ( ) - chars. as_str ( ) . len ( ) ) , e) ;
96+ }
97+ }
98+ Byte => {
99+ let mut chars = src. chars ( ) ;
100+ if let Err ( e) = unescape_char_or_byte ( & mut chars, Mode :: Byte ) {
101+ error_callback ( 0 ..( src. len ( ) - chars. as_str ( ) . len ( ) ) , e) ;
102+ }
103+ }
104+ Str => unescape_str ( src, |range, res| {
105+ if let Err ( e) = res {
106+ error_callback ( range, e) ;
107+ }
108+ } ) ,
109+ ByteStr => unescape_byte_str ( src, |range, res| {
110+ if let Err ( e) = res {
111+ error_callback ( range, e) ;
112+ }
113+ } ) ,
114+ CStr => unescape_c_str ( src, |range, res| {
115+ if let Err ( e) = res {
116+ error_callback ( range, e) ;
117+ }
118+ } ) ,
119+ RawStr => check_raw_str ( src, |range, res| {
120+ if let Err ( e) = res {
121+ error_callback ( range, e) ;
122+ }
123+ } ) ,
124+ RawByteStr => check_raw_byte_str ( src, |range, res| {
125+ if let Err ( e) = res {
126+ error_callback ( range, e) ;
127+ }
128+ } ) ,
129+ RawCStr => check_raw_c_str ( src, |range, res| {
130+ if let Err ( e) = res {
131+ error_callback ( range, e) ;
132+ }
133+ } ) ,
134+ }
135+ }
136+
137+ pub fn check_raw_str ( src : & str , mut callback : impl FnMut ( Range < usize > , Result < char , EscapeError > ) ) {
138+ unescape_unicode ( src, Mode :: RawStr , & mut callback)
139+ }
140+
141+ pub fn check_raw_byte_str (
142+ src : & str ,
143+ mut callback : impl FnMut ( Range < usize > , Result < u8 , EscapeError > ) ,
144+ ) {
145+ unescape_unicode ( src, Mode :: RawByteStr , & mut |r, res| {
146+ callback ( r, res. map ( byte_from_char) )
147+ } )
148+ }
149+
150+ pub fn check_raw_c_str (
151+ src : & str ,
152+ mut callback : impl FnMut ( Range < usize > , Result < char , EscapeError > ) ,
153+ ) {
154+ unescape_unicode ( src, Mode :: RawCStr , & mut callback)
155+ }
156+
157+ pub fn unescape_str ( src : & str , mut callback : impl FnMut ( Range < usize > , Result < char , EscapeError > ) ) {
158+ unescape_unicode ( src, Mode :: Str , & mut callback)
159+ }
160+
161+ pub fn unescape_byte_str (
162+ src : & str ,
163+ mut callback : impl FnMut ( Range < usize > , Result < u8 , EscapeError > ) ,
164+ ) {
165+ unescape_unicode ( src, Mode :: ByteStr , & mut |r, res| {
166+ callback ( r, res. map ( byte_from_char) )
167+ } )
168+ }
169+
170+ pub fn unescape_c_str (
171+ src : & str ,
172+ mut callback : impl FnMut ( Range < usize > , Result < MixedUnit , EscapeError > ) ,
173+ ) {
174+ unescape_mixed ( src, Mode :: CStr , & mut callback)
175+ }
176+
83177/// Takes the contents of a unicode-only (non-mixed-utf8) literal (without
84178/// quotes) and produces a sequence of escaped characters or errors.
85179///
86180/// Values are returned by invoking `callback`. For `Char` and `Byte` modes,
87181/// the callback will be called exactly once.
88- pub fn unescape_unicode < F > ( src : & str , mode : Mode , callback : & mut F )
182+ fn unescape_unicode < F > ( src : & str , mode : Mode , callback : & mut F )
89183where
90184 F : FnMut ( Range < usize > , Result < char , EscapeError > ) ,
91185{
@@ -146,7 +240,7 @@ impl From<u8> for MixedUnit {
146240/// a sequence of escaped characters or errors.
147241///
148242/// Values are returned by invoking `callback`.
149- pub fn unescape_mixed < F > ( src : & str , mode : Mode , callback : & mut F )
243+ fn unescape_mixed < F > ( src : & str , mode : Mode , callback : & mut F )
150244where
151245 F : FnMut ( Range < usize > , Result < MixedUnit , EscapeError > ) ,
152246{
@@ -443,7 +537,7 @@ where
443537}
444538
445539#[ inline]
446- pub fn byte_from_char ( c : char ) -> u8 {
540+ fn byte_from_char ( c : char ) -> u8 {
447541 let res = c as u32 ;
448542 debug_assert ! ( res <= u8 :: MAX as u32 , "guaranteed because of ByteStr" ) ;
449543 res as u8
0 commit comments