Skip to main content

jules_core/traits/
mod.rs

1//! Traits module for Jules-SDK core abstractions.
2
3use crate::client::ClientRequest;
4use crate::errors::SDKError;
5use crate::response::ClientResponse;
6use std::future::Future;
7
8/// The core Client trait defining standard interactions with the API.
9///
10/// It encapsulates sending a request and asynchronously waiting for a response.
11pub trait Client {
12    /// Sends a request and receives a response asynchronously.
13    fn send_request(
14        &self,
15        request: ClientRequest,
16    ) -> impl Future<Output = Result<ClientResponse, SDKError>> + Send;
17}
18
19#[cfg(test)]
20mod tests {
21    use super::*;
22    use crate::conversation::Conversation;
23    use crate::message::{Message, Role};
24
25    struct MockClient;
26
27    impl Client for MockClient {
28        async fn send_request(&self, _request: ClientRequest) -> Result<ClientResponse, SDKError> {
29            Ok(ClientResponse::new(Message::new(
30                Role::Assistant,
31                "Mock response",
32            )))
33        }
34    }
35
36    #[tokio::test]
37    async fn test_mock_client_send_request() {
38        let client = MockClient;
39        let mut conv = Conversation::new();
40        conv.add_message(Message::new(Role::User, "Hello"));
41        let req = ClientRequest::new(conv);
42        let response = client.send_request(req).await.unwrap();
43        assert_eq!(
44            response.message,
45            Message::new(Role::Assistant, "Mock response")
46        );
47    }
48}