forge_runtime/lib.rs
1//! ForgeKit runtime layer - File watching and caching.
2//!
3//! This crate provides runtime services for the ForgeKit SDK:
4//!
5//! - File watching with `notify` crate
6//! - Incremental indexing
7//! - Query caching
8//! - Connection pooling
9//!
10//! # Status
11//!
12//! This crate is currently a stub. Full implementation is planned for v0.3.
13
14use std::path::PathBuf;
15use std::time::Duration;
16
17/// Runtime configuration for indexing and caching.
18#[derive(Clone, Debug)]
19pub struct RuntimeConfig {
20 /// Enable file watching
21 pub watch_enabled: bool,
22 /// Cache TTL for symbol queries
23 pub symbol_cache_ttl: Duration,
24 /// Cache TTL for CFG queries
25 pub cfg_cache_ttl: Duration,
26 /// Maximum cache size
27 pub max_cache_size: usize,
28}
29
30impl Default for RuntimeConfig {
31 fn default() -> Self {
32 Self {
33 watch_enabled: false,
34 symbol_cache_ttl: Duration::from_secs(300),
35 cfg_cache_ttl: Duration::from_secs(600),
36 max_cache_size: 10_000,
37 }
38 }
39}
40
41/// Runtime statistics.
42#[derive(Clone, Debug)]
43pub struct RuntimeStats {
44 /// Current number of cached entries
45 pub cache_size: usize,
46 /// Whether file watcher is active
47 pub watch_active: bool,
48 /// Number of reindex operations performed
49 pub reindex_count: u64,
50}
51
52/// ForgeKit runtime for automatic reindexing and caching.
53///
54/// # Examples
55///
56/// ```rust,no_run
57/// use forge_runtime::ForgeRuntime;
58///
59/// # #[tokio::main]
60/// # async fn main() -> anyhow::Result<()> {
61/// # let runtime = ForgeRuntime::new("./my-project").await?;
62/// #
63/// # // Start file watcher
64/// # runtime.watch().await?;
65/// #
66/// # Ok(())
67/// # }
68/// ```
69pub struct ForgeRuntime {
70 pub config: RuntimeConfig,
71}
72
73impl ForgeRuntime {
74 /// Creates a new runtime with default configuration.
75 ///
76 /// # Arguments
77 ///
78 /// * `codebase_path` - Path to codebase
79 pub async fn new(_codebase_path: impl AsRef<std::path::Path>) -> anyhow::Result<Self> {
80 // TODO: Implement runtime initialization
81 Ok(Self {
82 config: RuntimeConfig::default(),
83 })
84 }
85
86 /// Creates a new runtime with custom configuration.
87 pub async fn with_config(
88 _codebase_path: impl AsRef<std::path::Path>,
89 config: RuntimeConfig,
90 ) -> anyhow::Result<Self> {
91 // TODO: Implement runtime initialization
92 Ok(Self { config })
93 }
94
95 /// Starts the file watcher for automatic reindexing.
96 ///
97 /// This will monitor the codebase for changes and trigger
98 /// reindexing as needed.
99 pub async fn watch(&self) -> anyhow::Result<()> {
100 // TODO: Implement file watching
101 Err(anyhow::anyhow!("File watching not yet implemented"))
102 }
103
104 /// Clears all caches.
105 pub async fn clear_cache(&self) -> anyhow::Result<()> {
106 // TODO: Implement cache clearing
107 Err(anyhow::anyhow!("Cache not yet implemented"))
108 }
109
110 /// Gets runtime statistics.
111 pub fn stats(&self) -> RuntimeStats {
112 RuntimeStats {
113 cache_size: 0,
114 watch_active: false,
115 reindex_count: 0,
116 }
117 }
118}
119
120#[cfg(test)]
121mod tests {
122 use super::*;
123
124 #[tokio::test]
125 async fn test_runtime_config_default() {
126 let config = RuntimeConfig::default();
127 assert_eq!(config.symbol_cache_ttl, Duration::from_secs(300));
128 }
129
130 #[tokio::test]
131 async fn test_runtime_creation() {
132 let temp = tempfile::tempdir().unwrap();
133 let runtime = ForgeRuntime::new(temp.path()).await.unwrap();
134 let stats = runtime.stats();
135
136 assert_eq!(stats.cache_size, 0);
137 assert!(!stats.watch_active);
138 }
139}