use crate::core::adapters::ai::KandilAI;
use anyhow::Result;
use serde::{Deserialize, Serialize};
use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct IdeExtension {
pub name: String,
pub version: String,
pub supported_ide: Vec<String>, pub features: Vec<ExtensionFeature>,
pub ai_client: Arc<KandilAI>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum ExtensionFeature {
InlineChat,
CodeGeneration,
Refactoring,
CodeReview,
Testing,
Documentation,
DebuggingAssistant,
Deployment,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExtensionContext {
pub file_path: String,
pub language: String,
pub selected_code: String,
pub cursor_position: (u32, u32),
pub workspace_root: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CodeSuggestion {
pub id: String,
pub title: String,
pub description: String,
pub code: String,
pub range: (u32, u32), pub confidence: f32,
pub category: SuggestionCategory,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SuggestionCategory {
Optimization,
Security,
Performance,
Style,
BugFix,
Enhancement,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InlineComment {
pub line_number: u32,
pub message: String,
pub severity: String, pub code_fix: Option<String>,
}
impl IdeExtension {
pub fn new(ai_client: Arc<KandilAI>) -> Self {
Self {
name: "Kandil Code Extension".to_string(),
version: "0.1.0".to_string(),
supported_ide: vec![
"VSCode".to_string(),
"IntelliJ".to_string(),
"Vim".to_string(),
"Emacs".to_string(),
],
features: vec![
ExtensionFeature::InlineChat,
ExtensionFeature::CodeGeneration,
ExtensionFeature::Refactoring,
ExtensionFeature::CodeReview,
ExtensionFeature::Testing,
ExtensionFeature::Documentation,
],
ai_client,
}
}
pub async fn get_code_suggestions(
&self,
context: &ExtensionContext,
) -> Result<Vec<CodeSuggestion>> {
let prompt = format!(
r#"Analyze this code for improvements:
Language: {}
Code:
{}
Provide specific, actionable suggestions for optimization, security, performance, or style improvements.
"#,
context.language, context.selected_code
);
let suggestions_text = self.ai_client.chat(&prompt).await?;
Ok(vec![CodeSuggestion {
id: "sugg-001".to_string(),
title: "Performance Optimization".to_string(),
description: "Consider caching this computation".to_string(),
code: "let cached_result = expensive_computation();".to_string(),
range: (context.cursor_position.0, context.cursor_position.0 + 1),
confidence: 0.85,
category: SuggestionCategory::Performance,
}])
}
pub async fn generate_documentation(&self, code: &str, language: &str) -> Result<String> {
let prompt = format!(
r#"Generate documentation for this {} code:
{}
Include:
- Function/class descriptions
- Parameter documentation
- Return value documentation
- Example usage
- Important notes
"#,
language, code
);
self.ai_client.chat(&prompt).await
}
pub async fn get_refactoring_options(&self, code: &str, language: &str) -> Result<Vec<String>> {
let prompt = format!(
r#"Suggest refactoring options for this {} code:
{}
Focus on: readability, maintainability, and best practices.
"#,
language, code
);
let response = self.ai_client.chat(&prompt).await?;
Ok(vec![response])
}
pub async fn run_inline_code_review(
&self,
code: &str,
language: &str,
) -> Result<Vec<InlineComment>> {
let prompt = format!(
r#"Perform inline code review for this {} code:
{}
Identify issues and suggest fixes. Return in format: line_number, issue, severity, fix.
"#,
language, code
);
let review = self.ai_client.chat(&prompt).await?;
Ok(vec![InlineComment {
line_number: 1,
message: review.chars().take(100).collect::<String>(),
severity: "info".to_string(),
code_fix: Some("Consider adding error handling".to_string()),
}])
}
pub async fn get_test_suggestions(&self, code: &str, language: &str) -> Result<String> {
let prompt = format!(
r#"Generate test cases for this {} code:
{}
Include unit tests, integration tests, and edge case tests.
"#,
language, code
);
self.ai_client.chat(&prompt).await
}
pub async fn explain_code(&self, code: &str, language: &str) -> Result<String> {
let prompt = format!(
r#"Explain this {} code in simple terms:
{}
Include the purpose, how it works, and any important details.
"#,
language, code
);
self.ai_client.chat(&prompt).await
}
pub fn get_supported_features(&self) -> &Vec<ExtensionFeature> {
&self.features
}
pub fn is_feature_available(&self, feature: &ExtensionFeature) -> bool {
self.features.contains(feature)
}
}