@@ -366,25 +366,21 @@ impl AppState<'_> {
366366// Parse a cell reference like "A1", "B10", etc.
367367fn parse_cell_reference ( input : & str ) -> Option < ( usize , usize ) > {
368368 // Cell references should have at least 2 characters (e.g., A1)
369- if input. len ( ) < 2 {
369+ if input. chars ( ) . count ( ) < 2 {
370370 return None ;
371371 }
372372
373373 // Find the first digit to separate column and row parts
374- let mut col_end = 0 ;
375- for ( i, c) in input. chars ( ) . enumerate ( ) {
376- if c. is_ascii_digit ( ) {
377- col_end = i;
378- break ;
379- }
380- }
374+ let col_end = input
375+ . char_indices ( )
376+ . find ( |( _, c) | c. is_ascii_digit ( ) )
377+ . map ( |( index, _) | index) ?;
381378
382379 if col_end == 0 {
383380 return None ; // No digits found
384381 }
385382
386- let col_part = & input[ 0 ..col_end] ;
387- let row_part = & input[ col_end..] ;
383+ let ( col_part, row_part) = input. split_at ( col_end) ;
388384
389385 // Convert column letters to index
390386 let col = col_name_to_index ( & col_part. to_uppercase ( ) ) ?;
@@ -394,3 +390,20 @@ fn parse_cell_reference(input: &str) -> Option<(usize, usize)> {
394390
395391 Some ( ( row, col) )
396392}
393+
394+ #[ cfg( test) ]
395+ mod tests {
396+ use super :: parse_cell_reference;
397+
398+ #[ test]
399+ fn parses_valid_cell_references ( ) {
400+ assert_eq ! ( parse_cell_reference( "A1" ) , Some ( ( 1 , 1 ) ) ) ;
401+ assert_eq ! ( parse_cell_reference( "BC12" ) , Some ( ( 12 , 55 ) ) ) ;
402+ }
403+
404+ #[ test]
405+ fn ignores_commands_with_non_ascii_arguments ( ) {
406+ assert_eq ! ( parse_cell_reference( "addsheet 测试1" ) , None ) ;
407+ assert_eq ! ( parse_cell_reference( "测试1" ) , None ) ;
408+ }
409+ }
0 commit comments