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