use std::{
collections::HashMap,
time::Duration,
path::{Path, PathBuf},
sync::{Arc, RwLock},
fmt::{self, Display},
};
use serde::{Deserialize, Serialize};
use thiserror::Error;
pub struct ConfigurationManager {
config: Arc<RwLock<OxirsConfig>>,
environment: Environment,
config_sources: Vec<ConfigSource>,
watchers: Vec<ConfigWatcher>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OxirsConfig {
pub performance: PerformanceConfig,
pub memory: MemoryConfig,
pub interning: InterningConfig,
pub indexing: IndexingConfig,
pub parsing: ParsingConfig,
pub serialization: SerializationConfig,
pub concurrency: ConcurrencyConfig,
pub monitoring: MonitoringConfig,
pub security: SecurityConfig,
pub optimization: OptimizationConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PerformanceConfig {
pub profile: PerformanceProfile,
pub custom_settings: HashMap<String, PerformanceValue>,
pub enable_auto_tuning: bool,
pub auto_tuning_sensitivity: f64,
pub monitoring_interval: Duration,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum PerformanceProfile {
Development,
Balanced,
HighPerformance,
MaxThroughput,
MemoryEfficient,
LowLatency,
BatchProcessing,
RealTime,
EdgeComputing,
Custom,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum PerformanceValue {
Boolean(bool),
Integer(i64),
Float(f64),
String(String),
Duration(u64), }
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemoryConfig {
pub arena: ArenaConfig,
pub gc: GcConfig,
pub pressure_thresholds: MemoryPressureConfig,
pub enable_tracking: bool,
pub pools: HashMap<String, MemoryPoolConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ArenaConfig {
pub initial_size: usize,
pub max_size: usize,
pub growth_factor: f64,
pub enable_compaction: bool,
pub compaction_threshold: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GcConfig {
pub strategy: GcStrategy,
pub trigger_threshold: f64,
pub max_pause_time: Duration,
pub enable_concurrent: bool,
pub worker_threads: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum GcStrategy {
None,
ReferenceCounting,
MarkAndSweep,
Generational,
Incremental,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemoryPressureConfig {
pub low_threshold: f64,
pub medium_threshold: f64,
pub high_threshold: f64,
pub critical_threshold: f64,
pub pressure_actions: HashMap<String, Vec<MemoryPressureAction>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum MemoryPressureAction {
ForceGc,
CompactArenas,
ClearCaches,
ReduceBuffers,
SuspendBackgroundTasks,
SendAlert,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemoryPoolConfig {
pub name: String,
pub initial_size: usize,
pub max_size: usize,
pub object_size: usize,
pub enable_preallocation: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InterningConfig {
pub global: GlobalInternerConfig,
pub scoped: ScopedInternerConfig,
pub cleanup: InternerCleanupConfig,
pub enable_statistics: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GlobalInternerConfig {
pub initial_capacity: usize,
pub load_factor: f64,
pub enable_weak_references: bool,
pub lru_cache_size: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ScopedInternerConfig {
pub default_capacity: usize,
pub max_scopes: usize,
pub scope_timeout: Duration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InternerCleanupConfig {
pub cleanup_interval: Duration,
pub cleanup_threshold: f64,
pub enable_automatic: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IndexingConfig {
pub default_strategy: IndexingStrategy,
pub strategy_configs: HashMap<String, IndexStrategyConfig>,
pub adaptive: AdaptiveIndexingConfig,
pub persistence: IndexPersistenceConfig,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum IndexingStrategy {
None,
Single,
Dual,
Triple,
AdaptiveMulti,
Custom,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IndexStrategyConfig {
pub name: String,
pub index_types: Vec<IndexType>,
pub bloom_filter: BloomFilterConfig,
pub compaction: IndexCompactionConfig,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum IndexType {
SPO,
POS,
OSP,
SOP,
PSO,
OPS,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BloomFilterConfig {
pub enabled: bool,
pub expected_items: usize,
pub false_positive_rate: f64,
pub hash_functions: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IndexCompactionConfig {
pub enabled: bool,
pub threshold: f64,
pub interval: Duration,
pub concurrent: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AdaptiveIndexingConfig {
pub enabled: bool,
pub analysis_window: Duration,
pub min_query_frequency: f64,
pub effectiveness_threshold: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IndexPersistenceConfig {
pub enabled: bool,
pub directory: PathBuf,
pub sync_interval: Duration,
pub compression: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ParsingConfig {
pub buffer_sizes: HashMap<String, usize>,
pub parsers: HashMap<String, ParserConfig>,
pub error_handling: ParserErrorConfig,
pub validation: ValidationConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ParserConfig {
pub name: String,
pub enable_streaming: bool,
pub chunk_size: usize,
pub enable_parallel: bool,
pub worker_threads: usize,
pub options: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ParserErrorConfig {
pub tolerance: f64,
pub continue_on_error: bool,
pub collect_errors: bool,
pub max_errors: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ValidationConfig {
pub enable_iri_validation: bool,
pub enable_literal_validation: bool,
pub enable_language_validation: bool,
pub custom_rules: Vec<ValidationRule>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ValidationRule {
pub name: String,
pub pattern: String,
pub error_message: String,
pub enabled: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SerializationConfig {
pub default_format: SerializationFormat,
pub formats: HashMap<String, FormatConfig>,
pub output: OutputConfig,
pub compression: CompressionConfig,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum SerializationFormat {
NTriples,
Turtle,
RdfXml,
JsonLd,
NQuads,
TriG,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FormatConfig {
pub name: String,
pub pretty_print: bool,
pub indent_size: usize,
pub line_length: usize,
pub options: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OutputConfig {
pub encoding: String,
pub buffer_size: usize,
pub enable_buffering: bool,
pub flush_interval: Duration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CompressionConfig {
pub enabled: bool,
pub algorithm: CompressionAlgorithm,
pub level: u8,
pub min_size: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum CompressionAlgorithm {
None,
Gzip,
Bzip2,
Lz4,
Zstd,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConcurrencyConfig {
pub thread_pool: ThreadPoolConfig,
pub locks: LockConfig,
pub async_runtime: AsyncRuntimeConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ThreadPoolConfig {
pub worker_threads: usize,
pub stack_size: usize,
pub priority: ThreadPriority,
pub work_stealing: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ThreadPriority {
Low,
Normal,
High,
Realtime,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LockConfig {
pub default_type: LockType,
pub timeout: Duration,
pub enable_debugging: bool,
pub deadlock_detection: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum LockType {
Mutex,
RwLock,
SpinLock,
AtomicLock,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AsyncRuntimeConfig {
pub runtime_type: AsyncRuntimeType,
pub enable_io: bool,
pub enable_time: bool,
pub worker_config: AsyncWorkerConfig,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AsyncRuntimeType {
CurrentThread,
MultiThread,
MultiThreadAlt,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AsyncWorkerConfig {
pub core_threads: usize,
pub max_threads: usize,
pub keep_alive: Duration,
pub thread_name_prefix: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MonitoringConfig {
pub enabled: bool,
pub metrics: MetricsConfig,
pub tracing: TracingConfig,
pub logging: LoggingConfig,
pub health_checks: HealthCheckConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetricsConfig {
pub exporter: MetricsExporter,
pub collection_interval: Duration,
pub retention_period: Duration,
pub custom_metrics: Vec<CustomMetric>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum MetricsExporter {
None,
Prometheus,
StatsD,
OpenMetrics,
Custom,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CustomMetric {
pub name: String,
pub metric_type: MetricType,
pub description: String,
pub labels: Vec<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum MetricType {
Counter,
Gauge,
Histogram,
Summary,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TracingConfig {
pub enabled: bool,
pub exporter: TraceExporter,
pub sampling_rate: f64,
pub max_spans: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum TraceExporter {
None,
Jaeger,
Zipkin,
OpenTelemetry,
Console,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LoggingConfig {
pub level: LogLevel,
pub format: LogFormat,
pub targets: Vec<LogTarget>,
pub structured: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum LogLevel {
Trace,
Debug,
Info,
Warn,
Error,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum LogFormat {
Plain,
Json,
Logfmt,
Custom,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum LogTarget {
Console,
File { path: PathBuf, rotation: FileRotation },
Syslog { facility: String },
Network { endpoint: String },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileRotation {
pub max_size: usize,
pub max_age: Duration,
pub max_files: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HealthCheckConfig {
pub enabled: bool,
pub interval: Duration,
pub timeout: Duration,
pub endpoints: Vec<HealthCheckEndpoint>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HealthCheckEndpoint {
pub name: String,
pub path: String,
pub check_type: HealthCheckType,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum HealthCheckType {
Liveness,
Readiness,
Startup,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SecurityConfig {
pub authentication: AuthenticationConfig,
pub authorization: AuthorizationConfig,
pub encryption: EncryptionConfig,
pub audit: AuditConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuthenticationConfig {
pub providers: Vec<AuthProvider>,
pub session: SessionConfig,
pub token: TokenConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AuthProvider {
None,
Basic { realm: String },
Bearer { issuer: String, audience: String },
OAuth2 { client_id: String, client_secret: String },
LDAP { server: String, base_dn: String },
Custom { provider_type: String, config: HashMap<String, String> },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SessionConfig {
pub timeout: Duration,
pub storage: SessionStorage,
pub encryption: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum SessionStorage {
Memory,
File,
Database,
Redis,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TokenConfig {
pub token_type: TokenType,
pub expiry: Duration,
pub refresh_enabled: bool,
pub signing_key: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum TokenType {
JWT,
Opaque,
PASETO,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuthorizationConfig {
pub model: AuthorizationModel,
pub permissions: Vec<Permission>,
pub roles: Vec<Role>,
pub policies: Vec<Policy>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AuthorizationModel {
None,
RBAC,
ABAC,
Custom,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Permission {
pub name: String,
pub description: String,
pub resource: String,
pub action: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Role {
pub name: String,
pub description: String,
pub permissions: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Policy {
pub name: String,
pub expression: String,
pub effect: PolicyEffect,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum PolicyEffect {
Allow,
Deny,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EncryptionConfig {
pub at_rest: EncryptionAtRest,
pub in_transit: EncryptionInTransit,
pub key_management: KeyManagementConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EncryptionAtRest {
pub enabled: bool,
pub algorithm: EncryptionAlgorithm,
pub key_size: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EncryptionInTransit {
pub enabled: bool,
pub tls_version: TlsVersion,
pub cert_path: PathBuf,
pub key_path: PathBuf,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum EncryptionAlgorithm {
AES128,
AES256,
ChaCha20,
XChaCha20,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum TlsVersion {
TLSv1_2,
TLSv1_3,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KeyManagementConfig {
pub provider: KeyProvider,
pub rotation_interval: Duration,
pub kdf: KeyDerivationFunction,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum KeyProvider {
File,
Environment,
HSM,
Vault,
AWS_KMS,
Azure_KeyVault,
GCP_KMS,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum KeyDerivationFunction {
PBKDF2,
Scrypt,
Argon2,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuditConfig {
pub enabled: bool,
pub log_path: PathBuf,
pub events: Vec<AuditEvent>,
pub retention: Duration,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AuditEvent {
Authentication,
Authorization,
DataAccess,
DataModification,
AdminActions,
SecurityEvents,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OptimizationConfig {
pub simd: SimdConfig,
pub zero_copy: ZeroCopyConfig,
pub prefetching: PrefetchingConfig,
pub caching: CachingConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SimdConfig {
pub enabled: bool,
pub instruction_set: SimdInstructionSet,
pub fallback_to_scalar: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum SimdInstructionSet {
None,
SSE2,
AVX,
AVX2,
AVX512,
NEON,
Auto,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ZeroCopyConfig {
pub enabled: bool,
pub arena_size: usize,
pub reference_counting: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PrefetchingConfig {
pub enabled: bool,
pub distance: usize,
pub strategy: PrefetchStrategy,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum PrefetchStrategy {
Sequential,
Random,
Adaptive,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CachingConfig {
pub caches: HashMap<String, CacheConfig>,
pub global: GlobalCacheConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CacheConfig {
pub name: String,
pub cache_type: CacheType,
pub max_size: usize,
pub ttl: Duration,
pub eviction_policy: EvictionPolicy,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum CacheType {
LRU,
LFU,
FIFO,
Random,
Adaptive,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum EvictionPolicy {
LRU,
LFU,
TTL,
Size,
Custom,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GlobalCacheConfig {
pub memory_limit: usize,
pub enable_statistics: bool,
pub enable_warming: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum Environment {
Development,
Testing,
Staging,
Production,
}
#[derive(Debug, Clone)]
pub enum ConfigSource {
File { path: PathBuf },
Environment,
CommandLine { args: Vec<String> },
Remote { url: String },
Database { connection: String },
}
pub struct ConfigWatcher {
source: ConfigSource,
callback: Box<dyn Fn(&OxirsConfig) + Send + Sync>,
}
#[derive(Debug, Error)]
pub enum ConfigError {
#[error("Configuration file not found: {0}")]
FileNotFound(PathBuf),
#[error("Invalid configuration format: {0}")]
InvalidFormat(String),
#[error("Validation error: {0}")]
ValidationError(String),
#[error("Environment variable error: {0}")]
EnvironmentError(String),
#[error("I/O error: {0}")]
IoError(#[from] std::io::Error),
#[error("Serialization error: {0}")]
SerializationError(#[from] serde_json::Error),
}
impl Default for OxirsConfig {
fn default() -> Self {
Self {
performance: PerformanceConfig::default(),
memory: MemoryConfig::default(),
interning: InterningConfig::default(),
indexing: IndexingConfig::default(),
parsing: ParsingConfig::default(),
serialization: SerializationConfig::default(),
concurrency: ConcurrencyConfig::default(),
monitoring: MonitoringConfig::default(),
security: SecurityConfig::default(),
optimization: OptimizationConfig::default(),
}
}
}
impl Default for PerformanceConfig {
fn default() -> Self {
Self {
profile: PerformanceProfile::Balanced,
custom_settings: HashMap::new(),
enable_auto_tuning: false,
auto_tuning_sensitivity: 0.5,
monitoring_interval: Duration::from_secs(60),
}
}
}
impl PerformanceProfile {
pub fn get_config(&self) -> HashMap<String, PerformanceValue> {
let mut config = HashMap::new();
match self {
Self::Development => {
config.insert("enable_debug".to_string(), PerformanceValue::Boolean(true));
config.insert("optimization_level".to_string(), PerformanceValue::Integer(0));
config.insert("enable_simd".to_string(), PerformanceValue::Boolean(false));
config.insert("thread_count".to_string(), PerformanceValue::Integer(2));
}
Self::Balanced => {
config.insert("optimization_level".to_string(), PerformanceValue::Integer(2));
config.insert("enable_simd".to_string(), PerformanceValue::Boolean(true));
config.insert("thread_count".to_string(), PerformanceValue::Integer(4));
config.insert("memory_limit_mb".to_string(), PerformanceValue::Integer(1024));
}
Self::HighPerformance => {
config.insert("optimization_level".to_string(), PerformanceValue::Integer(3));
config.insert("enable_simd".to_string(), PerformanceValue::Boolean(true));
config.insert("enable_zero_copy".to_string(), PerformanceValue::Boolean(true));
config.insert("thread_count".to_string(), PerformanceValue::Integer(8));
config.insert("memory_limit_mb".to_string(), PerformanceValue::Integer(4096));
}
Self::MaxThroughput => {
config.insert("optimization_level".to_string(), PerformanceValue::Integer(3));
config.insert("enable_simd".to_string(), PerformanceValue::Boolean(true));
config.insert("enable_zero_copy".to_string(), PerformanceValue::Boolean(true));
config.insert("enable_prefetching".to_string(), PerformanceValue::Boolean(true));
config.insert("thread_count".to_string(), PerformanceValue::Integer(16));
config.insert("memory_limit_mb".to_string(), PerformanceValue::Integer(8192));
}
Self::MemoryEfficient => {
config.insert("optimization_level".to_string(), PerformanceValue::Integer(1));
config.insert("enable_compression".to_string(), PerformanceValue::Boolean(true));
config.insert("memory_limit_mb".to_string(), PerformanceValue::Integer(256));
config.insert("gc_frequency".to_string(), PerformanceValue::Integer(10));
}
Self::LowLatency => {
config.insert("optimization_level".to_string(), PerformanceValue::Integer(3));
config.insert("enable_simd".to_string(), PerformanceValue::Boolean(true));
config.insert("enable_zero_copy".to_string(), PerformanceValue::Boolean(true));
config.insert("gc_strategy".to_string(), PerformanceValue::String("incremental".to_string()));
config.insert("response_timeout_ms".to_string(), PerformanceValue::Duration(100));
}
Self::BatchProcessing => {
config.insert("optimization_level".to_string(), PerformanceValue::Integer(3));
config.insert("enable_parallel".to_string(), PerformanceValue::Boolean(true));
config.insert("batch_size".to_string(), PerformanceValue::Integer(10000));
config.insert("thread_count".to_string(), PerformanceValue::Integer(32));
}
Self::RealTime => {
config.insert("enable_deterministic".to_string(), PerformanceValue::Boolean(true));
config.insert("max_latency_ms".to_string(), PerformanceValue::Duration(10));
config.insert("priority".to_string(), PerformanceValue::String("realtime".to_string()));
}
Self::EdgeComputing => {
config.insert("optimization_level".to_string(), PerformanceValue::Integer(2));
config.insert("memory_limit_mb".to_string(), PerformanceValue::Integer(128));
config.insert("thread_count".to_string(), PerformanceValue::Integer(2));
config.insert("enable_compression".to_string(), PerformanceValue::Boolean(true));
}
Self::Custom => {
}
}
config
}
pub fn description(&self) -> &'static str {
match self {
Self::Development => "Optimized for development with fast compilation and debugging support",
Self::Balanced => "Balanced configuration for general-purpose use",
Self::HighPerformance => "High-performance configuration with advanced optimizations",
Self::MaxThroughput => "Maximum throughput configuration with all optimizations enabled",
Self::MemoryEfficient => "Memory-efficient configuration for resource-constrained environments",
Self::LowLatency => "Low-latency configuration for real-time applications",
Self::BatchProcessing => "Optimized for large-scale batch processing",
Self::RealTime => "Real-time configuration with deterministic performance",
Self::EdgeComputing => "Optimized for edge computing and IoT devices",
Self::Custom => "User-defined custom configuration",
}
}
}
impl Display for PerformanceProfile {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let name = match self {
Self::Development => "Development",
Self::Balanced => "Balanced",
Self::HighPerformance => "High Performance",
Self::MaxThroughput => "Max Throughput",
Self::MemoryEfficient => "Memory Efficient",
Self::LowLatency => "Low Latency",
Self::BatchProcessing => "Batch Processing",
Self::RealTime => "Real Time",
Self::EdgeComputing => "Edge Computing",
Self::Custom => "Custom",
};
write!(f, "{}", name)
}
}
impl ConfigurationManager {
pub fn new() -> Self {
Self {
config: Arc::new(RwLock::new(OxirsConfig::default())),
environment: Environment::Development,
config_sources: Vec::new(),
watchers: Vec::new(),
}
}
pub fn load_from_file<P: AsRef<Path>>(&mut self, path: P) -> Result<(), ConfigError> {
let content = std::fs::read_to_string(&path)
.map_err(|_| ConfigError::FileNotFound(path.as_ref().to_path_buf()))?;
let config: OxirsConfig = if path.as_ref().extension() == Some(std::ffi::OsStr::new("toml")) {
toml::from_str(&content).map_err(|e| ConfigError::InvalidFormat(e.to_string()))?
} else {
serde_json::from_str(&content)?
};
self.update_config(config)?;
self.config_sources.push(ConfigSource::File { path: path.as_ref().to_path_buf() });
Ok(())
}
pub fn load_from_environment(&mut self) -> Result<(), ConfigError> {
let mut config = self.get_config().clone();
if let Ok(profile_str) = std::env::var("OXIRS_PERFORMANCE_PROFILE") {
if let Ok(profile) = serde_json::from_str::<PerformanceProfile>(&format!("\"{}\"", profile_str)) {
config.performance.profile = profile;
}
}
if let Ok(threads_str) = std::env::var("OXIRS_THREAD_COUNT") {
if let Ok(threads) = threads_str.parse::<usize>() {
config.concurrency.thread_pool.worker_threads = threads;
}
}
self.update_config(config)?;
self.config_sources.push(ConfigSource::Environment);
Ok(())
}
pub fn get_config(&self) -> OxirsConfig {
self.config.read().expect("lock should not be poisoned").clone()
}
pub fn update_config(&mut self, new_config: OxirsConfig) -> Result<(), ConfigError> {
self.validate_config(&new_config)?;
*self.config.write().expect("lock should not be poisoned") = new_config;
Ok(())
}
pub fn set_performance_profile(&mut self, profile: PerformanceProfile) -> Result<(), ConfigError> {
let mut config = self.get_config();
config.performance.profile = profile;
config.performance.custom_settings = profile.get_config();
self.update_config(config)
}
pub fn get_performance_profile(&self) -> PerformanceProfile {
self.get_config().performance.profile
}
fn validate_config(&self, config: &OxirsConfig) -> Result<(), ConfigError> {
if config.concurrency.thread_pool.worker_threads == 0 {
return Err(ConfigError::ValidationError("Worker thread count cannot be zero".to_string()));
}
if config.memory.arena.initial_size > config.memory.arena.max_size {
return Err(ConfigError::ValidationError("Initial arena size cannot exceed maximum".to_string()));
}
match config.performance.profile {
PerformanceProfile::RealTime => {
if config.concurrency.thread_pool.worker_threads > 4 {
return Err(ConfigError::ValidationError("Real-time profile should use fewer threads".to_string()));
}
}
PerformanceProfile::EdgeComputing => {
if config.memory.arena.max_size > 128 * 1024 * 1024 {
return Err(ConfigError::ValidationError("Edge computing profile should use less memory".to_string()));
}
}
_ => {}
}
Ok(())
}
pub fn add_watcher<F>(&mut self, source: ConfigSource, callback: F)
where
F: Fn(&OxirsConfig) + Send + Sync + 'static,
{
self.watchers.push(ConfigWatcher {
source,
callback: Box::new(callback),
});
}
pub async fn start_monitoring(&self) -> Result<(), ConfigError> {
Ok(())
}
}
impl Default for MemoryConfig {
fn default() -> Self {
Self {
arena: ArenaConfig::default(),
gc: GcConfig::default(),
pressure_thresholds: MemoryPressureConfig::default(),
enable_tracking: true,
pools: HashMap::new(),
}
}
}
impl Default for ArenaConfig {
fn default() -> Self {
Self {
initial_size: 1024 * 1024, max_size: 64 * 1024 * 1024, growth_factor: 2.0,
enable_compaction: true,
compaction_threshold: 0.5,
}
}
}
impl Default for GcConfig {
fn default() -> Self {
Self {
strategy: GcStrategy::MarkAndSweep,
trigger_threshold: 0.8,
max_pause_time: Duration::from_millis(10),
enable_concurrent: true,
worker_threads: 2,
}
}
}
impl Default for MemoryPressureConfig {
fn default() -> Self {
Self {
low_threshold: 0.6,
medium_threshold: 0.75,
high_threshold: 0.9,
critical_threshold: 0.95,
pressure_actions: HashMap::new(),
}
}
}
impl Default for InterningConfig {
fn default() -> Self {
Self {
global: GlobalInternerConfig::default(),
scoped: ScopedInternerConfig::default(),
cleanup: InternerCleanupConfig::default(),
enable_statistics: true,
}
}
}
impl Default for GlobalInternerConfig {
fn default() -> Self {
Self {
initial_capacity: 10000,
load_factor: 0.75,
enable_weak_references: true,
lru_cache_size: 1000,
}
}
}
impl Default for ScopedInternerConfig {
fn default() -> Self {
Self {
default_capacity: 1000,
max_scopes: 100,
scope_timeout: Duration::from_secs(3600),
}
}
}
impl Default for InternerCleanupConfig {
fn default() -> Self {
Self {
cleanup_interval: Duration::from_secs(300),
cleanup_threshold: 0.5,
enable_automatic: true,
}
}
}
impl Default for IndexingConfig {
fn default() -> Self {
Self {
default_strategy: IndexingStrategy::AdaptiveMulti,
strategy_configs: HashMap::new(),
adaptive: AdaptiveIndexingConfig::default(),
persistence: IndexPersistenceConfig::default(),
}
}
}
impl Default for AdaptiveIndexingConfig {
fn default() -> Self {
Self {
enabled: true,
analysis_window: Duration::from_secs(3600),
min_query_frequency: 0.1,
effectiveness_threshold: 0.8,
}
}
}
impl Default for IndexPersistenceConfig {
fn default() -> Self {
Self {
enabled: false,
directory: PathBuf::from("./indexes"),
sync_interval: Duration::from_secs(300),
compression: true,
}
}
}
impl Default for ParsingConfig {
fn default() -> Self {
Self {
buffer_sizes: HashMap::from([
("ntriples".to_string(), 64 * 1024),
("turtle".to_string(), 32 * 1024),
("rdfxml".to_string(), 128 * 1024),
("jsonld".to_string(), 64 * 1024),
]),
parsers: HashMap::new(),
error_handling: ParserErrorConfig::default(),
validation: ValidationConfig::default(),
}
}
}
impl Default for ParserErrorConfig {
fn default() -> Self {
Self {
tolerance: 0.01, continue_on_error: true,
collect_errors: true,
max_errors: 1000,
}
}
}
impl Default for ValidationConfig {
fn default() -> Self {
Self {
enable_iri_validation: true,
enable_literal_validation: true,
enable_language_validation: true,
custom_rules: Vec::new(),
}
}
}
impl Default for SerializationConfig {
fn default() -> Self {
Self {
default_format: SerializationFormat::Turtle,
formats: HashMap::new(),
output: OutputConfig::default(),
compression: CompressionConfig::default(),
}
}
}
impl Default for OutputConfig {
fn default() -> Self {
Self {
encoding: "UTF-8".to_string(),
buffer_size: 8192,
enable_buffering: true,
flush_interval: Duration::from_millis(100),
}
}
}
impl Default for CompressionConfig {
fn default() -> Self {
Self {
enabled: false,
algorithm: CompressionAlgorithm::Gzip,
level: 6,
min_size: 1024,
}
}
}
impl Default for ConcurrencyConfig {
fn default() -> Self {
Self {
thread_pool: ThreadPoolConfig::default(),
locks: LockConfig::default(),
async_runtime: AsyncRuntimeConfig::default(),
}
}
}
impl Default for ThreadPoolConfig {
fn default() -> Self {
Self {
worker_threads: 0, stack_size: 2 * 1024 * 1024, priority: ThreadPriority::Normal,
work_stealing: true,
}
}
}
impl Default for LockConfig {
fn default() -> Self {
Self {
default_type: LockType::RwLock,
timeout: Duration::from_secs(30),
enable_debugging: false,
deadlock_detection: true,
}
}
}
impl Default for AsyncRuntimeConfig {
fn default() -> Self {
Self {
runtime_type: AsyncRuntimeType::MultiThread,
enable_io: true,
enable_time: true,
worker_config: AsyncWorkerConfig::default(),
}
}
}
impl Default for AsyncWorkerConfig {
fn default() -> Self {
Self {
core_threads: num_cpus::get(),
max_threads: num_cpus::get() * 4,
keep_alive: Duration::from_secs(60),
thread_name_prefix: "oxirs-async".to_string(),
}
}
}
impl Default for MonitoringConfig {
fn default() -> Self {
Self {
enabled: true,
metrics: MetricsConfig::default(),
tracing: TracingConfig::default(),
logging: LoggingConfig::default(),
health_checks: HealthCheckConfig::default(),
}
}
}
impl Default for MetricsConfig {
fn default() -> Self {
Self {
exporter: MetricsExporter::Prometheus,
collection_interval: Duration::from_secs(15),
retention_period: Duration::from_secs(3600),
custom_metrics: Vec::new(),
}
}
}
impl Default for TracingConfig {
fn default() -> Self {
Self {
enabled: true,
exporter: TraceExporter::Jaeger,
sampling_rate: 0.1,
max_spans: 1000,
}
}
}
impl Default for LoggingConfig {
fn default() -> Self {
Self {
level: LogLevel::Info,
format: LogFormat::Json,
targets: vec![LogTarget::Console],
structured: true,
}
}
}
impl Default for HealthCheckConfig {
fn default() -> Self {
Self {
enabled: true,
interval: Duration::from_secs(30),
timeout: Duration::from_secs(5),
endpoints: Vec::new(),
}
}
}
impl Default for SecurityConfig {
fn default() -> Self {
Self {
authentication: AuthenticationConfig::default(),
authorization: AuthorizationConfig::default(),
encryption: EncryptionConfig::default(),
audit: AuditConfig::default(),
}
}
}
impl Default for AuthenticationConfig {
fn default() -> Self {
Self {
providers: vec![AuthProvider::None],
session: SessionConfig::default(),
token: TokenConfig::default(),
}
}
}
impl Default for SessionConfig {
fn default() -> Self {
Self {
timeout: Duration::from_secs(3600),
storage: SessionStorage::Memory,
encryption: true,
}
}
}
impl Default for TokenConfig {
fn default() -> Self {
Self {
token_type: TokenType::JWT,
expiry: Duration::from_secs(3600),
refresh_enabled: true,
signing_key: "default_key".to_string(),
}
}
}
impl Default for AuthorizationConfig {
fn default() -> Self {
Self {
model: AuthorizationModel::RBAC,
permissions: Vec::new(),
roles: Vec::new(),
policies: Vec::new(),
}
}
}
impl Default for EncryptionConfig {
fn default() -> Self {
Self {
at_rest: EncryptionAtRest::default(),
in_transit: EncryptionInTransit::default(),
key_management: KeyManagementConfig::default(),
}
}
}
impl Default for EncryptionAtRest {
fn default() -> Self {
Self {
enabled: false,
algorithm: EncryptionAlgorithm::AES256,
key_size: 256,
}
}
}
impl Default for EncryptionInTransit {
fn default() -> Self {
Self {
enabled: true,
tls_version: TlsVersion::TLSv1_3,
cert_path: PathBuf::from("cert.pem"),
key_path: PathBuf::from("key.pem"),
}
}
}
impl Default for KeyManagementConfig {
fn default() -> Self {
Self {
provider: KeyProvider::File,
rotation_interval: Duration::from_secs(86400 * 30), kdf: KeyDerivationFunction::Argon2,
}
}
}
impl Default for AuditConfig {
fn default() -> Self {
Self {
enabled: false,
log_path: PathBuf::from("./audit.log"),
events: vec![AuditEvent::Authentication, AuditEvent::Authorization],
retention: Duration::from_secs(86400 * 365), }
}
}
impl Default for OptimizationConfig {
fn default() -> Self {
Self {
simd: SimdConfig::default(),
zero_copy: ZeroCopyConfig::default(),
prefetching: PrefetchingConfig::default(),
caching: CachingConfig::default(),
}
}
}
impl Default for SimdConfig {
fn default() -> Self {
Self {
enabled: true,
instruction_set: SimdInstructionSet::Auto,
fallback_to_scalar: true,
}
}
}
impl Default for ZeroCopyConfig {
fn default() -> Self {
Self {
enabled: true,
arena_size: 1024 * 1024, reference_counting: true,
}
}
}
impl Default for PrefetchingConfig {
fn default() -> Self {
Self {
enabled: true,
distance: 64,
strategy: PrefetchStrategy::Adaptive,
}
}
}
impl Default for CachingConfig {
fn default() -> Self {
Self {
caches: HashMap::new(),
global: GlobalCacheConfig::default(),
}
}
}
impl Default for GlobalCacheConfig {
fn default() -> Self {
Self {
memory_limit: 256 * 1024 * 1024, enable_statistics: true,
enable_warming: true,
}
}
}
include!("config_tests.rs");