use juncture_core::State;
use juncture_core::edge::END;
use juncture_core::state::messages::Message;
#[must_use]
pub fn tools_condition<S: State + serde::Serialize>(
state: &S,
messages_field: &str,
) -> &'static str {
juncture_core::tools_condition(state, messages_field)
}
#[must_use]
pub fn tools_condition_from_messages(messages: &[Message]) -> &'static str {
messages
.last()
.map_or(END, |m| if m.has_tool_calls() { "tools" } else { END })
}
#[cfg(test)]
mod tests {
use super::*;
use juncture_core::state::messages::{MessagesState, ToolCall};
use serde_json::json;
#[test]
fn test_from_messages_empty() {
let messages: Vec<Message> = vec![];
assert_eq!(tools_condition_from_messages(&messages), END);
}
#[test]
fn test_from_messages_human() {
let messages = vec![Message::human("Hello")];
assert_eq!(tools_condition_from_messages(&messages), END);
}
#[test]
fn test_from_messages_ai_no_tools() {
let messages = vec![Message::ai("Hello")];
assert_eq!(tools_condition_from_messages(&messages), END);
}
#[test]
fn test_from_messages_ai_with_tools() {
let messages = vec![Message::ai_with_tool_calls(
"I'll search for that",
vec![ToolCall {
id: "call_123".to_string(),
name: "search".to_string(),
arguments: json!({"query": "test"}),
}],
)];
assert_eq!(tools_condition_from_messages(&messages), "tools");
}
#[test]
fn test_from_messages_last_message_only() {
let messages = vec![
Message::human("Search"),
Message::ai_with_tool_calls(
"Searching",
vec![ToolCall {
id: "call_123".to_string(),
name: "search".to_string(),
arguments: json!({}),
}],
),
Message::human("Never mind"),
];
assert_eq!(tools_condition_from_messages(&messages), END);
}
#[test]
fn test_state_based_empty_messages() {
let state = MessagesState { messages: vec![] };
assert_eq!(tools_condition(&state, "messages"), END);
}
#[test]
fn test_state_based_human_message() {
let state = MessagesState {
messages: vec![Message::human("Hello")],
};
assert_eq!(tools_condition(&state, "messages"), END);
}
#[test]
fn test_state_based_ai_no_tools() {
let state = MessagesState {
messages: vec![Message::ai("Hello")],
};
assert_eq!(tools_condition(&state, "messages"), END);
}
#[test]
fn test_state_based_ai_with_tools() {
let state = MessagesState {
messages: vec![Message::ai_with_tool_calls(
"I'll search",
vec![ToolCall {
id: "call_1".to_string(),
name: "search".to_string(),
arguments: json!({"q": "test"}),
}],
)],
};
assert_eq!(tools_condition(&state, "messages"), "tools");
}
#[test]
fn test_state_based_last_ai_message_with_tools() {
let state = MessagesState {
messages: vec![
Message::human("Search"),
Message::ai_with_tool_calls(
"Searching",
vec![ToolCall {
id: "call_1".to_string(),
name: "search".to_string(),
arguments: json!({}),
}],
),
Message::human("Never mind"),
],
};
assert_eq!(tools_condition(&state, "messages"), "tools");
}
#[test]
fn test_state_based_custom_field_name() {
let state = MessagesState {
messages: vec![Message::ai_with_tool_calls(
"Working",
vec![ToolCall {
id: "call_1".to_string(),
name: "search".to_string(),
arguments: json!({}),
}],
)],
};
assert_eq!(tools_condition(&state, "messages"), "tools");
}
#[test]
fn test_state_based_non_existent_field() {
let state = MessagesState {
messages: vec![Message::ai_with_tool_calls(
"Working",
vec![ToolCall {
id: "call_1".to_string(),
name: "search".to_string(),
arguments: json!({}),
}],
)],
};
assert_eq!(tools_condition(&state, "nonexistent"), END);
}
}