chatty-rs 0.0.1-alpha1

A terminal-based chat client for OpenAI's GPT models.
Documentation
pub mod sqlite;

use std::{collections::HashMap, sync::Arc};

use crate::{
    config::StorageConfig,
    models::{Context, Conversation, Message, storage::FilterConversation},
};
use async_trait::async_trait;
use eyre::Result;
use sqlite::Sqlite;

#[async_trait]
pub trait Storage {
    async fn get_conversation(&self, id: &str) -> Result<Option<Conversation>>;
    async fn get_conversations(
        &self,
        filter: FilterConversation,
    ) -> Result<HashMap<String, Conversation>>;
    async fn get_messages(&self, conversation_id: &str) -> Result<Vec<Message>>;
    async fn upsert_conversation(&self, conversation: Conversation) -> Result<()>;
    async fn delete_conversation(&self, id: &str) -> Result<()>;
    async fn add_messages(&self, conversation_id: &str, message: &[Message]) -> Result<()>;
    async fn upsert_message(&self, conversation_id: &str, message: Message) -> Result<()>;
    async fn delete_messsage(&self, id: &str) -> Result<()>;
    async fn upsert_context(&self, conversation_id: &str, context: Context) -> Result<()>;
}

pub type ArcStorage = Arc<dyn Storage + Send + Sync>;

pub async fn new_storage(config: &StorageConfig) -> Result<ArcStorage> {
    let storage = match config {
        StorageConfig::Sqlite(sqlite_config) => {
            Arc::new(Sqlite::new(sqlite_config.path.as_deref()).await?)
        }
    };
    Ok(storage)
}