Skip to main content

jules_core/builder/
request.rs

1use crate::client::ClientRequest;
2use crate::conversation::Conversation;
3use crate::message::Message;
4
5/// A builder for creating a `ClientRequest`.
6#[derive(Debug, Clone, Default)]
7pub struct RequestBuilder {
8    conversation: Conversation,
9}
10
11impl RequestBuilder {
12    /// Creates a new `RequestBuilder`.
13    #[must_use]
14    pub fn new() -> Self {
15        Self::default()
16    }
17
18    /// Sets the entire conversation for the request.
19    #[must_use]
20    pub fn conversation(mut self, conversation: Conversation) -> Self {
21        self.conversation = conversation;
22        self
23    }
24
25    /// Adds a single message to the conversation.
26    #[must_use]
27    pub fn add_message(mut self, message: Message) -> Self {
28        self.conversation.add_message(message);
29        self
30    }
31
32    /// Builds the `ClientRequest`.
33    #[must_use]
34    pub fn build(self) -> ClientRequest {
35        ClientRequest::new(self.conversation)
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42    use crate::message::Role;
43
44    #[test]
45    fn test_request_builder_default() {
46        let builder = RequestBuilder::new();
47        let req = builder.build();
48        assert!(req.conversation.messages().is_empty());
49    }
50
51    #[test]
52    fn test_request_builder_with_conversation() {
53        let mut conv = Conversation::new();
54        conv.add_message(Message::new(Role::User, "Hello"));
55
56        let builder = RequestBuilder::new().conversation(conv.clone());
57        let req = builder.build();
58
59        assert_eq!(req.conversation, conv);
60    }
61
62    #[test]
63    fn test_request_builder_add_message() {
64        let builder = RequestBuilder::new().add_message(Message::new(Role::User, "Hello"));
65        let req = builder.build();
66
67        assert_eq!(req.conversation.messages().len(), 1);
68        assert_eq!(req.conversation.messages()[0].content(), "Hello");
69    }
70}