mod diff_configs;
mod fetch_node_config;
mod prioritize_node;
mod reload_sources;
mod search_configs;
pub use diff_configs::{DiffResult, diff_configs};
pub use fetch_node_config::fetch_node_config;
pub use prioritize_node::prioritize_node;
pub use reload_sources::reload_sources;
pub use search_configs::{NodeMatches, SearchMatch, SearchResult, search_configs};
use crate::error::OxidizedError;
use crate::oxidized::{OxidizedBackend, OxidizedClient};
use crate::resources::{MAX_SUGGESTIONS, find_similar_nodes};
use serde::Serialize;
#[derive(Debug, Clone, Serialize)]
#[must_use = "ToolResult should be returned to the caller"]
pub struct ToolResult {
pub success: bool,
pub message: String,
pub node: String,
}
impl ToolResult {
pub fn success(node: &str, message: impl Into<String>) -> Self {
Self {
success: true,
message: message.into(),
node: node.to_string(),
}
}
pub fn failure(node: &str, message: impl Into<String>) -> Self {
Self {
success: false,
message: message.into(),
node: node.to_string(),
}
}
}
pub(crate) async fn enrich_node_not_found(
backend: &OxidizedClient,
node_name: String,
) -> OxidizedError {
let suggestions = match backend.get_nodes().await {
Ok((nodes, _)) => find_similar_nodes(&nodes, &node_name, MAX_SUGGESTIONS),
Err(_) => vec![],
};
OxidizedError::NodeNotFound(node_name, suggestions)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_tool_result_success() {
let result = ToolResult::success("SW-01", "Backup triggered");
assert!(result.success);
assert_eq!(result.node, "SW-01");
assert!(result.message.contains("Backup"));
}
#[test]
fn test_tool_result_failure() {
let result = ToolResult::failure("SW-01", "Node not found");
assert!(!result.success);
assert_eq!(result.node, "SW-01");
}
#[test]
fn test_tool_result_serializes() {
let result = ToolResult::success("SW-01", "Test message");
let json = serde_json::to_string(&result).expect("Should serialize");
assert!(json.contains("\"success\":true"));
assert!(json.contains("\"node\":\"SW-01\""));
assert!(json.contains("\"message\":"));
}
#[test]
fn test_tool_result_success_with_into_string() {
let result = ToolResult::success("node", String::from("Message"));
assert!(result.success);
assert_eq!(result.message, "Message");
}
#[test]
fn test_tool_result_failure_with_into_string() {
let result = ToolResult::failure("node", String::from("Error"));
assert!(!result.success);
assert_eq!(result.message, "Error");
}
#[test]
fn test_reload_sources_result_message() {
let result = ToolResult::success(
"",
"Oxidized sources reloaded. New devices are now available in the inventory.",
);
assert!(result.success);
assert!(result.message.contains("reloaded"));
assert!(result.node.is_empty());
}
}