ait 0.6.0

AIT is a terminal based chat interface for interacting with large language models from various providers.
Documentation
use ratatui::{
    text::{Line, Span},
    widgets::{ListItem, ListState},
};

pub struct ModelList {
    pub items: Vec<ModelItem>,
    pub state: ListState,
}

#[derive(Debug)]
pub struct ModelItem {
    pub provider: String,
    pub name: String,
    pub selected: bool,
}

impl FromIterator<(&'static str, &'static str, bool)> for ModelList {
    fn from_iter<I: IntoIterator<Item = (&'static str, &'static str, bool)>>(iter: I) -> Self {
        let items = iter
            .into_iter()
            .map(|(provider, name, selected)| ModelItem::new(provider, name, selected))
            .collect();
        let mut state = ListState::default();
        state.select_first();
        Self { items, state }
    }
}

impl FromIterator<(String, String, bool)> for ModelList {
    fn from_iter<I: IntoIterator<Item = (String, String, bool)>>(iter: I) -> Self {
        let items = iter
            .into_iter()
            .map(|(provider, name, selected)| ModelItem::new(&provider, &name, selected))
            .collect();
        let mut state = ListState::default();
        state.select_first();
        Self { items, state }
    }
}

impl ModelItem {
    pub fn new(provider: &str, name: &str, selected: bool) -> Self {
        Self {
            provider: provider.to_string(),
            name: name.to_string(),
            selected,
        }
    }
}

impl From<&ModelItem> for ListItem<'_> {
    fn from(value: &ModelItem) -> Self {
        let line = Line::from(Span::raw(format!("{}: {}", value.provider, value.name)));
        ListItem::new(line)
    }
}