use crate::contracts::model::{Model, ReasoningEffort};
use crate::contracts::runner::Runner;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema, PartialEq)]
#[serde(default, deny_unknown_fields)]
pub struct PhaseOverrideConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub runner: Option<Runner>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<Model>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reasoning_effort: Option<ReasoningEffort>,
}
impl PhaseOverrideConfig {
pub fn merge_from(&mut self, other: Self) {
if other.runner.is_some() {
self.runner = other.runner;
}
if other.model.is_some() {
self.model = other.model;
}
if other.reasoning_effort.is_some() {
self.reasoning_effort = other.reasoning_effort;
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema, PartialEq)]
#[serde(default, deny_unknown_fields)]
pub struct PhaseOverrides {
#[serde(skip_serializing_if = "Option::is_none")]
pub phase1: Option<PhaseOverrideConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub phase2: Option<PhaseOverrideConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub phase3: Option<PhaseOverrideConfig>,
}
impl PhaseOverrides {
pub fn merge_from(&mut self, other: Self) {
match (&mut self.phase1, other.phase1) {
(Some(existing), Some(new)) => existing.merge_from(new),
(None, Some(new)) => self.phase1 = Some(new),
_ => {}
}
match (&mut self.phase2, other.phase2) {
(Some(existing), Some(new)) => existing.merge_from(new),
(None, Some(new)) => self.phase2 = Some(new),
_ => {}
}
match (&mut self.phase3, other.phase3) {
(Some(existing), Some(new)) => existing.merge_from(new),
(None, Some(new)) => self.phase3 = Some(new),
_ => {}
}
}
}