capability-example 0.1.0

A framework for managing skill tree growth and configuration using automated and manual strategies, ideal for AI-driven environments.
Documentation
// ---------------- [ File: capability-example/src/store_failed_snippet.rs ]
crate::ix!();

pub fn store_failed_snippet(
    fail_dir: &PathBuf,
    type_name: &str,
    snippet_text: &str,
) -> std::io::Result<PathBuf> {
    std::fs::create_dir_all(fail_dir)?;
    let base_name = format!(
        "{}-parse-failure",
        type_name
            .to_lowercase()
            .replace(' ', "-")
            .replace('_', "-")
    );
    // find next free index
    let mut index = 0;
    loop {
        let candidate = fail_dir.join(format!("{}{}.json", base_name, index));
        if !candidate.exists() {
            // write snippet
            std::fs::write(&candidate, snippet_text)?;
            return Ok(candidate);
        }
        index += 1;
    }
}

/// Tries to parse the raw clipboard as type T.  
/// Returns:
///   Ok(Some(value)) if parse succeeded,
///   Ok(None) if it wasn't valid at all for that type (like a total JSON parse fail),
///   Err(()) if it was valid JSON but fuzzy parse failed => we store it in fail-dir.
pub fn attempt_snippet_parse<T: FuzzyFromJsonValue>(
    raw_clipboard: &str,
    type_name: &str,
    fail_dir: Option<&PathBuf>,
) -> Result<Option<T>, ()> {
    // 1) Attempt raw JSON parse
    let parsed_json: serde_json::Value = match serde_json::from_str(raw_clipboard) {
        Ok(val) => val,
        Err(_e) => {
            // It's not even valid JSON => definitely not parseable as T => return Ok(None)
            return Ok(None);
        }
    };

    // 2) Attempt fuzzy parse
    match T::fuzzy_from_json_value(&parsed_json) {
        Ok(obj) => {
            // Full success
            Ok(Some(obj))
        }
        Err(ffve) => {
            // Fuzzy parse error => let's store it if the user gave fail_dir
            if let Some(dir) = fail_dir {
                match store_failed_snippet(dir, type_name, raw_clipboard) {
                    Ok(path) => warn!("Wrote fuzzy-parse failure snippet to {path:?}"),
                    Err(e) => warn!("Unable to store fuzzy-parse failure snippet: {e}"),
                }
            }
            Err(())
        }
    }
}