Skip to content

Commit 54301f6

Browse files
committed
fix: cat tool in windows abs paths, try last colon, and not fail if there is not a line range
1 parent 97d91f3 commit 54301f6

File tree

1 file changed

+36
-35
lines changed

1 file changed

+36
-35
lines changed

refact-agent/engine/src/tools/tool_cat.rs

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,32 @@ pub struct ToolCat;
2525
const CAT_MAX_IMAGES_CNT: usize = 1;
2626

2727
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+
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

Comments
 (0)