Skip to main content

llama_cpp_bindings/model/
llama_chat_message.rs

1use std::ffi::CString;
2
3use crate::NewLlamaChatMessageError;
4
5/// A Safe wrapper around `llama_chat_message`
6#[derive(Debug, Eq, PartialEq, Clone)]
7pub struct LlamaChatMessage {
8    pub(super) role: CString,
9    pub(super) content: CString,
10}
11
12impl LlamaChatMessage {
13    /// Create a new `LlamaChatMessage`
14    ///
15    /// # Errors
16    /// If either of ``role`` or ``content`` contain null bytes.
17    pub fn new(role: String, content: String) -> Result<Self, NewLlamaChatMessageError> {
18        Ok(Self {
19            role: CString::new(role)?,
20            content: CString::new(content)?,
21        })
22    }
23}
24
25#[cfg(test)]
26mod tests {
27    use super::LlamaChatMessage;
28
29    #[test]
30    fn valid_construction() {
31        let message = LlamaChatMessage::new("user".to_string(), "hello".to_string());
32
33        assert!(message.is_ok());
34    }
35
36    #[test]
37    fn null_byte_in_role_returns_error() {
38        let message = LlamaChatMessage::new("us\0er".to_string(), "hello".to_string());
39
40        assert!(message.is_err());
41    }
42
43    #[test]
44    fn null_byte_in_content_returns_error() {
45        let message = LlamaChatMessage::new("user".to_string(), "hel\0lo".to_string());
46
47        assert!(message.is_err());
48    }
49
50    #[test]
51    fn empty_strings_are_valid() {
52        let message = LlamaChatMessage::new(String::new(), String::new());
53
54        assert!(message.is_ok());
55    }
56}