pub mod documents;
pub mod env;
pub mod loader;
pub mod merge;
pub mod modes;
pub use documents::{Document, DocumentLoader};
pub use env::EnvOverrides;
pub use loader::ConfigLoader;
pub use merge::ConfigMerger;
pub use modes::StorageModeHandler;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Config {
pub providers: ProvidersConfig,
pub defaults: DefaultsConfig,
#[serde(default)]
pub steering: Vec<SteeringRule>,
#[serde(default)]
pub custom: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ProvidersConfig {
#[serde(default)]
pub api_keys: HashMap<String, String>,
#[serde(default)]
pub endpoints: HashMap<String, String>,
pub default_provider: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct DefaultsConfig {
pub model: Option<String>,
pub temperature: Option<f32>,
pub max_tokens: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct SteeringRule {
pub name: String,
pub content: String,
pub format: crate::types::DocumentFormat,
}
impl Default for Config {
fn default() -> Self {
Config {
providers: ProvidersConfig {
api_keys: HashMap::new(),
endpoints: HashMap::new(),
default_provider: None,
},
defaults: DefaultsConfig {
model: None,
temperature: None,
max_tokens: None,
},
steering: Vec::new(),
custom: HashMap::new(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_config_default() {
let config = Config::default();
assert!(config.providers.api_keys.is_empty());
assert!(config.defaults.model.is_none());
assert!(config.steering.is_empty());
}
}