Skip to main content

agentic_reality/engine/write/
environment.rs

1//! Environment write operations.
2
3use crate::engine::write::WriteEngine;
4use crate::types::environment::*;
5use crate::types::error::{RealityError, RealityResult};
6
7impl<'a> WriteEngine<'a> {
8    /// Sense the environment — set the full environment medium.
9    pub fn sense_environment(&mut self, medium: EnvironmentMedium) -> RealityResult<()> {
10        self.engine.environment_store.medium = Some(medium);
11        self.engine.mark_dirty();
12        Ok(())
13    }
14
15    /// Update environment state.
16    pub fn update_environment_state(&mut self, state: EnvironmentState) -> RealityResult<()> {
17        let medium = self
18            .engine
19            .environment_store
20            .medium
21            .as_mut()
22            .ok_or_else(|| RealityError::NotInitialized("environment".into()))?;
23        medium.current_state = state;
24        self.engine.mark_dirty();
25        Ok(())
26    }
27
28    /// Update environment mood.
29    pub fn update_mood(&mut self, mood: EnvironmentMood) -> RealityResult<()> {
30        let medium = self
31            .engine
32            .environment_store
33            .medium
34            .as_mut()
35            .ok_or_else(|| RealityError::NotInitialized("environment".into()))?;
36        medium.current_state.mood = mood;
37        self.engine.mark_dirty();
38        Ok(())
39    }
40
41    /// Record an active incident.
42    pub fn record_incident(&mut self, incident: ActiveIncident) -> RealityResult<()> {
43        let medium = self
44            .engine
45            .environment_store
46            .medium
47            .as_mut()
48            .ok_or_else(|| RealityError::NotInitialized("environment".into()))?;
49        medium.current_state.incidents.push(incident);
50        self.engine.mark_dirty();
51        Ok(())
52    }
53
54    /// Clear an incident by ID.
55    pub fn clear_incident(&mut self, incident_id: &str) -> RealityResult<()> {
56        let medium = self
57            .engine
58            .environment_store
59            .medium
60            .as_mut()
61            .ok_or_else(|| RealityError::NotInitialized("environment".into()))?;
62        medium
63            .current_state
64            .incidents
65            .retain(|i| i.id != incident_id);
66        self.engine.mark_dirty();
67        Ok(())
68    }
69
70    /// Update environment physics (constraints).
71    pub fn update_physics(&mut self, physics: EnvironmentPhysics) -> RealityResult<()> {
72        let medium = self
73            .engine
74            .environment_store
75            .medium
76            .as_mut()
77            .ok_or_else(|| RealityError::NotInitialized("environment".into()))?;
78        medium.physics = physics;
79        self.engine.mark_dirty();
80        Ok(())
81    }
82
83    /// Record a weather event.
84    pub fn record_weather(&mut self, event: WeatherEvent) -> RealityResult<()> {
85        let medium = self
86            .engine
87            .environment_store
88            .medium
89            .as_mut()
90            .ok_or_else(|| RealityError::NotInitialized("environment".into()))?;
91        medium.weather_history.push(event);
92        self.engine.mark_dirty();
93        Ok(())
94    }
95
96    /// Update the context fingerprint.
97    pub fn update_fingerprint(&mut self, fingerprint: ContextFingerprint) -> RealityResult<()> {
98        self.engine.environment_store.fingerprint = Some(fingerprint);
99        self.engine.mark_dirty();
100        Ok(())
101    }
102
103    /// Add an inhabitant.
104    pub fn add_inhabitant(&mut self, inhabitant: String) -> RealityResult<()> {
105        let medium = self
106            .engine
107            .environment_store
108            .medium
109            .as_mut()
110            .ok_or_else(|| RealityError::NotInitialized("environment".into()))?;
111        if !medium.inhabitants.contains(&inhabitant) {
112            medium.inhabitants.push(inhabitant);
113        }
114        self.engine.mark_dirty();
115        Ok(())
116    }
117
118    /// Remove an inhabitant.
119    pub fn remove_inhabitant(&mut self, inhabitant: &str) -> RealityResult<()> {
120        let medium = self
121            .engine
122            .environment_store
123            .medium
124            .as_mut()
125            .ok_or_else(|| RealityError::NotInitialized("environment".into()))?;
126        medium.inhabitants.retain(|i| i != inhabitant);
127        self.engine.mark_dirty();
128        Ok(())
129    }
130}