use std::collections::HashMap;
use bock_air::AIRNode;
use bock_types::Strictness;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct TargetProfile {
pub id: String,
pub display_name: String,
pub capabilities: HashMap<String, String>,
pub conventions: HashMap<String, String>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct ModuleContext {
pub module_path: String,
pub imports: Vec<String>,
pub siblings: Vec<String>,
pub annotations: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DecisionRef {
pub decision: String,
pub choice: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum OptimizationHint {
Performance,
Idiomatic,
CodeSize,
Custom(String),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Alternative {
pub label: String,
pub reasoning: Option<String>,
pub confidence: f64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct CandidateRule {
pub target_id: String,
pub pattern: String,
pub template: String,
pub priority: i32,
}
#[derive(Debug, Clone)]
pub struct GenerateRequest {
pub node: AIRNode,
pub target: TargetProfile,
pub module_context: ModuleContext,
pub prior_decisions: Vec<DecisionRef>,
pub strictness: Strictness,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GenerateResponse {
pub code: String,
pub confidence: f64,
pub reasoning: Option<String>,
pub alternatives: Vec<Alternative>,
}
#[derive(Debug, Clone)]
pub struct RepairRequest {
pub original_code: String,
pub compiler_error: String,
pub node: AIRNode,
pub target: TargetProfile,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RepairResponse {
pub fixed_code: String,
pub confidence: f64,
pub candidate_rule: Option<CandidateRule>,
pub reasoning: Option<String>,
}
#[derive(Debug, Clone)]
pub struct OptimizeRequest {
pub working_code: String,
pub node: AIRNode,
pub target: TargetProfile,
pub optimization_hints: Vec<OptimizationHint>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct OptimizeResponse {
pub optimized_code: String,
pub confidence: f64,
pub improvements: Vec<String>,
pub reasoning: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SelectOption {
pub id: String,
pub description: String,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct SelectContext {
pub error: Option<String>,
pub annotations: Vec<String>,
pub history: Vec<String>,
pub metadata: HashMap<String, String>,
}
#[derive(Debug, Clone)]
pub struct SelectRequest {
pub options: Vec<SelectOption>,
pub context: SelectContext,
pub rationale_prompt: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SelectResponse {
pub selected_id: String,
pub confidence: f64,
pub reasoning: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn target_profile_default_is_empty() {
let p = TargetProfile::default();
assert!(p.id.is_empty());
assert!(p.capabilities.is_empty());
}
#[test]
fn alternative_fields() {
let alt = Alternative {
label: "async-std".into(),
reasoning: Some("less ecosystem momentum".into()),
confidence: 0.3,
};
assert_eq!(alt.label, "async-std");
assert!(alt.confidence < 0.5);
}
#[test]
fn select_option_equality() {
let a = SelectOption {
id: "retry".into(),
description: "retry with exponential backoff".into(),
};
let b = SelectOption {
id: "retry".into(),
description: "retry with exponential backoff".into(),
};
assert_eq!(a, b);
}
}