pub mod bash_parser;
pub mod display_tree;
pub mod encoder;
pub mod mmap;
pub mod mode_prompts;
pub mod output_compress;
pub mod path;
pub mod path_prob;
pub mod repo;
pub mod syntax;
pub mod workspace_stats;
use crate::types::Initialize;
use serde_json::Value;
use tracing::debug;
pub fn floor_char_boundary(s: &str, idx: usize) -> usize {
if idx >= s.len() {
return s.len();
}
let mut i = idx;
while i > 0 && !s.is_char_boundary(i) {
i -= 1;
}
i
}
pub fn test_json_parsing(json_str: &str) -> Result<(), String> {
let raw_json_result = serde_json::from_str::<Value>(json_str);
if let Err(e) = raw_json_result {
return Err(format!("Invalid JSON format: {e}"));
}
let init_result = serde_json::from_str::<Initialize>(json_str);
match init_result {
Ok(init) => {
debug!(
init_type = ?init.init_type,
mode_name = ?init.mode_name,
code_writer_config = ?init.code_writer_config,
task_id_to_resume = init.task_id_to_resume,
"Successfully parsed JSON into Initialize struct"
);
Ok(())
}
Err(e) => Err(format!("Failed to parse JSON into Initialize struct: {e}")),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn floor_char_boundary_snaps_into_multibyte() {
let s = "a\u{3000}b"; assert_eq!(floor_char_boundary(s, 0), 0);
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 {
let cut = floor_char_boundary(s, i);
let _ = &s[cut..];
}
}
}