@@ -25,6 +25,32 @@ pub struct ToolCat;
2525const CAT_MAX_IMAGES_CNT : usize = 1 ;
2626
2727fn 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+
2854 let raw_paths = match args. get ( "paths" ) {
2955 Some ( Value :: String ( s) ) => {
3056 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
3763 let mut path_line_ranges = HashMap :: new ( ) ;
3864
3965 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 ) ,
7072 }
71-
72- paths. push ( file_path) ;
7373 } 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) ;
7778 }
7879
7980 let symbols = match args. get ( "symbols" ) {
0 commit comments