@@ -25,6 +25,32 @@ pub struct ToolCat;
25
25
const CAT_MAX_IMAGES_CNT : usize = 1 ;
26
26
27
27
fn parse_cat_args ( args : & HashMap < String , Value > ) -> Result < ( Vec < String > , HashMap < String , Option < ( usize , usize ) > > , Vec < String > ) , String > {
28
+ fn try_parse_line_range ( s : & str ) -> Result < Option < ( usize , usize ) > , String > {
29
+ let s = s. trim ( ) ;
30
+
31
+ // Try parsing as a single number (like "10")
32
+ if let Ok ( n) = s. parse :: < usize > ( ) {
33
+ return Ok ( Some ( ( n, n) ) ) ;
34
+ }
35
+
36
+ // Try parsing as a range (like "10-20")
37
+ if s. contains ( '-' ) {
38
+ let parts = s. split ( '-' ) . collect :: < Vec < _ > > ( ) ;
39
+ if parts. len ( ) == 2 {
40
+ if let Ok ( start) = parts[ 0 ] . trim ( ) . parse :: < usize > ( ) {
41
+ if let Ok ( end) = parts[ 1 ] . trim ( ) . parse :: < usize > ( ) {
42
+ if start > end {
43
+ return Err ( format ! ( "Start line ({}) cannot be greater than end line ({})" , start, end) ) ;
44
+ }
45
+ return Ok ( Some ( ( start, end) ) ) ;
46
+ }
47
+ }
48
+ }
49
+ }
50
+
51
+ Ok ( None ) // Not a line range - likely a Windows path
52
+ }
53
+
28
54
let raw_paths = match args. get ( "paths" ) {
29
55
Some ( Value :: String ( s) ) => {
30
56
s. split ( "," ) . map ( |x|x. trim ( ) . to_string ( ) ) . collect :: < Vec < _ > > ( )
@@ -37,43 +63,18 @@ fn parse_cat_args(args: &HashMap<String, Value>) -> Result<(Vec<String>, HashMap
37
63
let mut path_line_ranges = HashMap :: new ( ) ;
38
64
39
65
for path_str in raw_paths {
40
- if let Some ( colon_pos) = path_str. find ( ':' ) {
41
- let ( file_path, range_str) = path_str. split_at ( colon_pos) ;
42
- let file_path = file_path. trim ( ) . to_string ( ) ;
43
- let range_str = range_str[ 1 ..] . trim ( ) ; // Remove the colon
44
-
45
- // Parse the line range
46
- if range_str. contains ( '-' ) {
47
- let range_parts: Vec < & str > = range_str. split ( '-' ) . collect ( ) ;
48
- if range_parts. len ( ) == 2 {
49
- let start = match range_parts[ 0 ] . trim ( ) . parse :: < usize > ( ) {
50
- Ok ( n) => n,
51
- Err ( _) => return Err ( format ! ( "Invalid start line: {}" , range_parts[ 0 ] ) )
52
- } ;
53
- let end = match range_parts[ 1 ] . trim ( ) . parse :: < usize > ( ) {
54
- Ok ( n) => n,
55
- Err ( _) => return Err ( format ! ( "Invalid end line: {}" , range_parts[ 1 ] ) )
56
- } ;
57
- if start > end {
58
- return Err ( format ! ( "Start line ({}) cannot be greater than end line ({})" , start, end) ) ;
59
- }
60
- path_line_ranges. insert ( file_path. clone ( ) , Some ( ( start, end) ) ) ;
61
- } else {
62
- return Err ( format ! ( "Invalid line range format: {}" , range_str) ) ;
63
- }
64
- } else {
65
- // Single line case
66
- match range_str. parse :: < usize > ( ) {
67
- Ok ( n) => path_line_ranges. insert ( file_path. clone ( ) , Some ( ( n, n) ) ) ,
68
- Err ( _) => return Err ( format ! ( "Invalid line number: {}" , range_str) )
69
- } ;
66
+ let ( file_path, range) = if let Some ( colon_pos) = path_str. rfind ( ':' ) {
67
+ match try_parse_line_range ( & path_str[ colon_pos+1 ..] ) ? {
68
+ Some ( ( start, end) ) => {
69
+ ( path_str[ ..colon_pos] . trim ( ) . to_string ( ) , Some ( ( start, end) ) )
70
+ } ,
71
+ None => ( path_str, None ) ,
70
72
}
71
-
72
- paths. push ( file_path) ;
73
73
} else {
74
- paths. push ( path_str. clone ( ) ) ;
75
- path_line_ranges. insert ( path_str, None ) ;
76
- }
74
+ ( path_str, None )
75
+ } ;
76
+ path_line_ranges. insert ( file_path. clone ( ) , range) ;
77
+ paths. push ( file_path) ;
77
78
}
78
79
79
80
let symbols = match args. get ( "symbols" ) {
0 commit comments