Skip to main content

codec/
limits.rs

1//! Limits for codec-level decoding.
2
3/// Codec-specific limits enforced during snapshot decoding.
4#[derive(Debug, Clone, PartialEq, Eq)]
5pub struct CodecLimits {
6    /// Maximum number of entities in an ENTITY_CREATE section.
7    pub max_entities_create: usize,
8    /// Maximum number of entities in an ENTITY_UPDATE section.
9    pub max_entities_update: usize,
10    /// Maximum number of entities in an ENTITY_DESTROY section.
11    pub max_entities_destroy: usize,
12    /// Maximum number of components per entity.
13    pub max_components_per_entity: usize,
14    /// Maximum number of fields per component.
15    pub max_fields_per_component: usize,
16    /// Maximum number of bytes in a section body.
17    pub max_section_bytes: usize,
18    /// Maximum number of entities after applying a delta.
19    pub max_total_entities_after_apply: usize,
20}
21
22impl Default for CodecLimits {
23    fn default() -> Self {
24        Self {
25            max_entities_create: 1024,
26            max_entities_update: 2048,
27            max_entities_destroy: 1024,
28            max_components_per_entity: 64,
29            max_fields_per_component: 64,
30            max_section_bytes: 64 * 1024,
31            max_total_entities_after_apply: 4096,
32        }
33    }
34}
35
36impl CodecLimits {
37    /// Creates limits suitable for testing with smaller values.
38    #[must_use]
39    pub const fn for_testing() -> Self {
40        Self {
41            max_entities_create: 32,
42            max_entities_update: 64,
43            max_entities_destroy: 32,
44            max_components_per_entity: 16,
45            max_fields_per_component: 16,
46            max_section_bytes: 4096,
47            max_total_entities_after_apply: 128,
48        }
49    }
50
51    /// Creates limits with no restrictions (use with caution).
52    #[must_use]
53    pub const fn unlimited() -> Self {
54        Self {
55            max_entities_create: usize::MAX,
56            max_entities_update: usize::MAX,
57            max_entities_destroy: usize::MAX,
58            max_components_per_entity: usize::MAX,
59            max_fields_per_component: usize::MAX,
60            max_section_bytes: usize::MAX,
61            max_total_entities_after_apply: usize::MAX,
62        }
63    }
64}
65
66#[cfg(test)]
67mod tests {
68    use super::*;
69
70    #[test]
71    fn default_limits_are_reasonable() {
72        let limits = CodecLimits::default();
73        assert!(limits.max_entities_create >= 128);
74        assert!(limits.max_section_bytes >= 1024);
75    }
76
77    #[test]
78    fn testing_limits_smaller() {
79        let test_limits = CodecLimits::for_testing();
80        let default_limits = CodecLimits::default();
81        assert!(test_limits.max_entities_create < default_limits.max_entities_create);
82        assert!(test_limits.max_section_bytes < default_limits.max_section_bytes);
83    }
84
85    #[test]
86    fn unlimited_limits() {
87        let limits = CodecLimits::unlimited();
88        assert_eq!(limits.max_entities_create, usize::MAX);
89        assert_eq!(limits.max_section_bytes, usize::MAX);
90    }
91}