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