ricecoder_storage/config/
mod.rs

1//! Configuration loading and management
2//!
3//! This module provides configuration loading from multiple formats (YAML, TOML, JSON),
4//! environment variable overrides, and configuration merging with precedence rules.
5
6pub mod documents;
7pub mod env;
8pub mod loader;
9pub mod merge;
10pub mod modes;
11
12// Re-export commonly used types
13pub use documents::{Document, DocumentLoader};
14pub use env::EnvOverrides;
15pub use loader::ConfigLoader;
16pub use merge::ConfigMerger;
17pub use modes::StorageModeHandler;
18
19use serde::{Deserialize, Serialize};
20use std::collections::HashMap;
21
22/// Main configuration structure
23#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
24pub struct Config {
25    /// Provider configurations
26    pub providers: ProvidersConfig,
27    /// Default settings
28    pub defaults: DefaultsConfig,
29    /// Steering rules
30    #[serde(default)]
31    pub steering: Vec<SteeringRule>,
32    /// Additional custom settings
33    #[serde(default)]
34    pub custom: HashMap<String, serde_json::Value>,
35}
36
37/// Provider configuration
38#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
39pub struct ProvidersConfig {
40    /// API keys for various providers
41    #[serde(default)]
42    pub api_keys: HashMap<String, String>,
43    /// Endpoints for various providers
44    #[serde(default)]
45    pub endpoints: HashMap<String, String>,
46    /// Default provider to use
47    pub default_provider: Option<String>,
48}
49
50/// Default settings
51#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
52pub struct DefaultsConfig {
53    /// Default model to use
54    pub model: Option<String>,
55    /// Default temperature for LLM
56    pub temperature: Option<f32>,
57    /// Default max tokens for LLM
58    pub max_tokens: Option<u32>,
59}
60
61/// Steering rule
62#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
63pub struct SteeringRule {
64    /// Rule name
65    pub name: String,
66    /// Rule content
67    pub content: String,
68    /// Format of the rule
69    pub format: crate::types::DocumentFormat,
70}
71
72impl Default for Config {
73    fn default() -> Self {
74        Config {
75            providers: ProvidersConfig {
76                api_keys: HashMap::new(),
77                endpoints: HashMap::new(),
78                default_provider: None,
79            },
80            defaults: DefaultsConfig {
81                model: None,
82                temperature: None,
83                max_tokens: None,
84            },
85            steering: Vec::new(),
86            custom: HashMap::new(),
87        }
88    }
89}
90
91#[cfg(test)]
92mod tests {
93    use super::*;
94
95    #[test]
96    fn test_config_default() {
97        let config = Config::default();
98        assert!(config.providers.api_keys.is_empty());
99        assert!(config.defaults.model.is_none());
100        assert!(config.steering.is_empty());
101    }
102}