winx_code_agent/utils/
mod.rs1pub mod bash_parser;
7pub mod display_tree;
8pub mod encoder;
9pub mod mmap;
10pub mod mode_prompts;
11pub mod orchestration;
12pub mod output_compress;
13pub mod path;
14pub mod path_prob;
15pub mod redact;
16pub mod repo;
17pub mod scratch_file;
18pub mod symbols;
19pub mod syntax;
20pub mod workspace_stats;
21
22use crate::types::Initialize;
23use serde_json::Value;
24use tracing::debug;
25
26pub fn floor_char_boundary(s: &str, idx: usize) -> usize {
34 if idx >= s.len() {
35 return s.len();
36 }
37 let mut i = idx;
38 while i > 0 && !s.is_char_boundary(i) {
39 i -= 1;
40 }
41 i
42}
43
44pub fn test_json_parsing(json_str: &str) -> Result<(), String> {
46 let raw_json_result = serde_json::from_str::<Value>(json_str);
48 if let Err(e) = raw_json_result {
49 return Err(format!("Invalid JSON format: {e}"));
50 }
51
52 let init_result = serde_json::from_str::<Initialize>(json_str);
54 match init_result {
55 Ok(init) => {
56 debug!(
57 init_type = ?init.init_type,
58 mode_name = ?init.mode_name,
59 code_writer_config = ?init.code_writer_config,
60 task_id_to_resume = init.task_id_to_resume,
61 "Successfully parsed JSON into Initialize struct"
62 );
63 Ok(())
64 }
65 Err(e) => Err(format!("Failed to parse JSON into Initialize struct: {e}")),
66 }
67}
68
69#[cfg(test)]
70mod tests {
71 use super::*;
72
73 #[test]
74 fn floor_char_boundary_snaps_into_multibyte() {
75 let s = "a\u{3000}b"; assert_eq!(floor_char_boundary(s, 0), 0);
77 assert_eq!(floor_char_boundary(s, 1), 1); assert_eq!(floor_char_boundary(s, 2), 1); assert_eq!(floor_char_boundary(s, 3), 1); assert_eq!(floor_char_boundary(s, 4), 4); assert_eq!(floor_char_boundary(s, 999), s.len()); for i in 0..=s.len() + 5 {
84 let cut = floor_char_boundary(s, i);
85 let _ = &s[cut..];
86 }
87 }
88}