use std::str::FromStr; use serde::{Deserialize, Serialize}; use crate::{client::GeminiClient, error::Result, prelude::TokenProvider}; #[derive(Clone, Debug, Serialize, Deserialize)] pub enum Role { User, Model, } impl ToString for Role { fn to_string(&self) -> String { match self { Role::User => "user".to_string(), Role::Model => "model".to_string(), } } } impl FromStr for Role { type Err = (); fn from_str(s: &str) -> std::result::Result { match s { "user" => Ok(Role::User), "model" => Ok(Role::Model), _ => Err(()), } } } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Message { pub role: Role, pub text: String, } impl Message { pub fn new(role: Role, text: &str) -> Self { Message { role, text: text.to_string(), } } } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Dialogue { messages: Vec, } impl Dialogue { pub fn new() -> Self { Dialogue { messages: vec![] } } pub async fn do_turn( &mut self, gemini: &GeminiClient, message: &str, ) -> Result { self.messages.push(Message::new(Role::User, message)); let response = gemini.prompt_conversation(&self.messages).await?; self.messages.push(response.clone()); Ok(response) } }