llm 1.3.8

A Rust library unifying multiple LLM backends.
Documentation
use llm::builder::LLMBackend;

use crate::config::NavigationMode;
use crate::provider::ProviderId;

#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub enum OnboardingStep {
    Welcome,
    Provider,
    ApiKey,
    Preferences,
    Confirm,
}

#[derive(Debug, Clone)]
pub struct OnboardingProvider {
    pub id: ProviderId,
    pub name: String,
    pub backend: LLMBackend,
}

#[derive(Debug, Clone)]
pub struct OnboardingState {
    pub step: OnboardingStep,
    pub providers: Vec<OnboardingProvider>,
    pub selected: usize,
    pub api_key: String,
    pub mode: NavigationMode,
    pub theme: String,
    pub error: Option<String>,
}

impl OnboardingState {
    pub fn new(providers: Vec<OnboardingProvider>, mode: NavigationMode, theme: String) -> Self {
        Self {
            step: OnboardingStep::Welcome,
            providers,
            selected: 0,
            api_key: String::new(),
            mode,
            theme,
            error: None,
        }
    }

    pub fn next_step(&mut self) {
        self.step = match self.step {
            OnboardingStep::Welcome => OnboardingStep::Provider,
            OnboardingStep::Provider => OnboardingStep::ApiKey,
            OnboardingStep::ApiKey => OnboardingStep::Preferences,
            OnboardingStep::Preferences => OnboardingStep::Confirm,
            OnboardingStep::Confirm => OnboardingStep::Confirm,
        };
        self.error = None;
    }

    pub fn prev_step(&mut self) {
        self.step = match self.step {
            OnboardingStep::Welcome => OnboardingStep::Welcome,
            OnboardingStep::Provider => OnboardingStep::Welcome,
            OnboardingStep::ApiKey => OnboardingStep::Provider,
            OnboardingStep::Preferences => OnboardingStep::ApiKey,
            OnboardingStep::Confirm => OnboardingStep::Preferences,
        };
        self.error = None;
    }

    pub fn select_next(&mut self) {
        if !self.providers.is_empty() {
            self.selected = (self.selected + 1).min(self.providers.len().saturating_sub(1));
        }
    }

    pub fn select_prev(&mut self) {
        if self.selected > 0 {
            self.selected = self.selected.saturating_sub(1);
        }
    }

    pub fn selected_provider(&self) -> Option<&OnboardingProvider> {
        self.providers.get(self.selected)
    }

    pub fn set_error(&mut self, message: impl Into<String>) {
        self.error = Some(message.into());
    }
}