use super::super::selection::SelectionState;
use super::super::suggestion::parse_suggestions;
use crate::ai::ai_state::AiState;
#[cfg(test)]
pub const TEST_MAX_CONTEXT_LENGTH: usize = 50_000;
impl AiState {
#[cfg(test)]
pub fn new(enabled: bool) -> Self {
Self {
visible: false,
enabled,
configured: false,
provider_name: "AI".to_string(),
model_name: String::new(),
max_context_length: TEST_MAX_CONTEXT_LENGTH,
loading: false,
error: None,
response: String::new(),
previous_response: None,
request_tx: None,
response_rx: None,
request_id: 0,
last_query_hash: None,
in_flight_request_id: None,
current_cancel_token: None,
suggestions: Vec::new(),
selection: SelectionState::new(),
previous_popup_height: None,
}
}
pub fn new_with_config(
enabled: bool,
configured: bool,
provider_name: String,
model_name: String,
max_context_length: usize,
) -> Self {
Self {
visible: enabled,
enabled,
configured,
provider_name,
model_name,
max_context_length,
loading: false,
error: None,
response: String::new(),
previous_response: None,
request_tx: None,
response_rx: None,
request_id: 0,
last_query_hash: None,
in_flight_request_id: None,
current_cancel_token: None,
suggestions: Vec::new(),
selection: SelectionState::new(),
previous_popup_height: None,
}
}
pub fn toggle(&mut self) {
self.visible = !self.visible;
}
#[cfg(test)]
pub fn close(&mut self) {
self.visible = false;
}
pub fn start_request(&mut self) {
if !self.response.is_empty() {
self.previous_response = Some(self.response.clone());
}
self.response.clear();
self.error = None;
self.loading = true;
self.request_id = self.request_id.wrapping_add(1);
self.in_flight_request_id = Some(self.request_id);
self.suggestions.clear();
self.selection.clear_selection();
self.selection.clear_layout();
}
pub fn complete_request(&mut self) {
self.loading = false;
self.previous_response = None;
self.in_flight_request_id = None;
self.suggestions = parse_suggestions(&self.response);
self.selection.clear_layout();
}
pub fn set_error(&mut self, error: String) {
self.error = Some(error);
self.loading = false;
self.in_flight_request_id = None;
}
#[cfg(test)]
pub fn clear_on_success(&mut self) {
self.response.clear();
self.error = None;
self.previous_response = None;
self.loading = false;
}
pub fn clear_stale_response(&mut self) {
self.response.clear();
self.error = None;
self.previous_response = None;
self.loading = false;
}
}