66use super :: { ExtendedBigDecimal , FormatError } ;
77use crate :: format:: spec:: ArgumentLocation ;
88use crate :: {
9- error:: { UError , set_exit_code} ,
9+ error:: set_exit_code,
10+ os_str_as_bytes_verbose, os_str_as_str_verbose,
1011 parser:: num_parser:: { ExtendedParser , ExtendedParserError } ,
1112 quoting_style:: { Quotes , QuotingStyle , escape_name} ,
1213 show_error, show_warning,
1314} ;
1415use os_display:: Quotable ;
1516use std:: {
16- error:: Error ,
1717 ffi:: { OsStr , OsString } ,
18- fmt:: Display ,
1918 num:: NonZero ,
2019} ;
2120
@@ -77,7 +76,7 @@ impl<'a> FormatArguments<'a> {
7776 pub fn next_char ( & mut self , position : & ArgumentLocation ) -> Result < u8 , FormatError > {
7877 match self . next_arg ( position) {
7978 Some ( FormatArgument :: Char ( c) ) => Ok ( * c as u8 ) ,
80- Some ( FormatArgument :: Unparsed ( os) ) => match try_get_bytes_from_os_str ( os) ?. first ( ) {
79+ Some ( FormatArgument :: Unparsed ( os) ) => match os_str_as_bytes_verbose ( os) ?. first ( ) {
8180 Some ( & byte) => Ok ( byte) ,
8281 None => Ok ( b'\0' ) ,
8382 } ,
@@ -96,7 +95,7 @@ impl<'a> FormatArguments<'a> {
9695 match self . next_arg ( position) {
9796 Some ( FormatArgument :: SignedInt ( n) ) => Ok ( * n) ,
9897 Some ( FormatArgument :: Unparsed ( os) ) => {
99- let str = try_get_str_from_os_str ( os) ?;
98+ let str = os_str_as_str_verbose ( os) ?;
10099
101100 Ok ( extract_value ( i64:: extended_parse ( str) , str) )
102101 }
@@ -108,7 +107,7 @@ impl<'a> FormatArguments<'a> {
108107 match self . next_arg ( position) {
109108 Some ( FormatArgument :: UnsignedInt ( n) ) => Ok ( * n) ,
110109 Some ( FormatArgument :: Unparsed ( os) ) => {
111- let s = try_get_str_from_os_str ( os) ?;
110+ let s = os_str_as_str_verbose ( os) ?;
112111 // Check if the string is a character literal enclosed in quotes
113112 if s. starts_with ( [ '"' , '\'' ] ) {
114113 // Extract the content between the quotes safely using chars
@@ -139,7 +138,7 @@ impl<'a> FormatArguments<'a> {
139138 match self . next_arg ( position) {
140139 Some ( FormatArgument :: Float ( n) ) => Ok ( n. clone ( ) ) ,
141140 Some ( FormatArgument :: Unparsed ( os) ) => {
142- let s = try_get_str_from_os_str ( os) ?;
141+ let s = os_str_as_str_verbose ( os) ?;
143142
144143 Ok ( extract_value ( ExtendedBigDecimal :: extended_parse ( s) , s) )
145144 }
@@ -207,59 +206,6 @@ fn extract_value<T: Default>(p: Result<T, ExtendedParserError<'_, T>>, input: &s
207206 }
208207}
209208
210- #[ derive( Debug ) ]
211- pub struct NonUtf8OsStr ( pub String ) ;
212-
213- impl Display for NonUtf8OsStr {
214- fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
215- f. write_fmt ( format_args ! (
216- "invalid (non-UTF-8) string like {} encountered" ,
217- self . 0 . quote( ) ,
218- ) )
219- }
220- }
221-
222- impl Error for NonUtf8OsStr { }
223- impl UError for NonUtf8OsStr { }
224-
225- pub fn try_get_str_from_os_str ( os_str : & OsStr ) -> Result < & str , NonUtf8OsStr > {
226- match os_str. to_str ( ) {
227- Some ( st) => Ok ( st) ,
228- None => {
229- let cow = os_str. to_string_lossy ( ) ;
230-
231- Err ( NonUtf8OsStr ( cow. to_string ( ) ) )
232- }
233- }
234- }
235-
236- pub fn try_get_bytes_from_os_str ( input : & OsStr ) -> Result < & [ u8 ] , NonUtf8OsStr > {
237- let result = {
238- #[ cfg( target_family = "unix" ) ]
239- {
240- use std:: os:: unix:: ffi:: OsStrExt ;
241-
242- Ok ( input. as_bytes ( ) )
243- }
244-
245- #[ cfg( not( target_family = "unix" ) ) ]
246- {
247- // TODO
248- // Verify that this works correctly on these platforms
249- match input. to_str ( ) . map ( |st| st. as_bytes ( ) ) {
250- Some ( sl) => Ok ( sl) ,
251- None => {
252- let cow = input. to_string_lossy ( ) ;
253-
254- Err ( NonUtf8OsStr ( cow. to_string ( ) ) )
255- }
256- }
257- }
258- } ;
259-
260- result
261- }
262-
263209#[ cfg( test) ]
264210mod tests {
265211 use super :: * ;
0 commit comments