Skip to main content

forge_core/config/
function.rs

1//! Function execution configuration.
2
3use std::time::Duration;
4
5use serde::{Deserialize, Serialize};
6
7use super::types::DurationStr;
8
9/// Function execution configuration.
10#[derive(Debug, Clone, Serialize, Deserialize)]
11#[non_exhaustive]
12pub struct FunctionConfig {
13    /// Maximum concurrent function executions.
14    #[serde(default = "default_max_concurrent")]
15    pub max_concurrent: usize,
16
17    /// Function timeout duration (e.g. "30s", "5m").
18    #[serde(default = "default_function_timeout")]
19    pub timeout: DurationStr,
20
21    /// Advisory memory limit per function execution (e.g. "512mb", "1gb").
22    ///
23    /// This value is exposed as configuration metadata for orchestrators
24    /// (e.g., Kubernetes resource requests) and observability dashboards.
25    /// It is not enforced at the process level since Rust does not provide
26    /// per-function memory sandboxing. Use container-level limits for hard
27    /// enforcement.
28    #[serde(default = "default_memory_limit")]
29    pub memory_limit: String,
30}
31
32impl Default for FunctionConfig {
33    fn default() -> Self {
34        Self {
35            max_concurrent: default_max_concurrent(),
36            timeout: default_function_timeout(),
37            memory_limit: default_memory_limit(),
38        }
39    }
40}
41
42impl FunctionConfig {
43    /// Advisory memory limit in bytes, parsed from the size string.
44    pub fn memory_limit_bytes(&self) -> crate::Result<usize> {
45        crate::util::parse_size(&self.memory_limit).ok_or_else(|| {
46            crate::ForgeError::config(format!(
47                "invalid function.memory_limit '{}'. Expected a size like '512mb', '1gb', or '536870912'",
48                self.memory_limit
49            ))
50        })
51    }
52}
53
54fn default_max_concurrent() -> usize {
55    1000
56}
57
58fn default_function_timeout() -> DurationStr {
59    DurationStr::new(Duration::from_secs(30))
60}
61
62fn default_memory_limit() -> String {
63    "512mb".to_string()
64}