Skip to main content

feagi_agent/command_and_control/
feagi_message.rs

1use crate::command_and_control::agent_embodiment_configuration_message::AgentEmbodimentConfigurationMessage;
2use crate::command_and_control::agent_registration_message::AgentRegistrationMessage;
3use crate::command_and_control::health_check_message::HealthCheckMessage;
4use crate::command_and_control::messages::burst_engine::BurstEnginesMessage;
5use crate::FeagiAgentError;
6use feagi_io::AgentID;
7use feagi_serialization::FeagiByteContainer;
8use feagi_structures::FeagiJSON;
9use serde::{Deserialize, Serialize};
10
11// All Command and Control messages are within this nested enum.
12#[allow(clippy::large_enum_variant)]
13#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
14#[serde(rename_all = "snake_case")]
15pub enum FeagiMessage {
16    HeartBeat,
17    AgentRegistration(AgentRegistrationMessage),
18    HealthCheck(HealthCheckMessage),
19    AgentConfiguration(AgentEmbodimentConfigurationMessage),
20    BurstEngine(BurstEnginesMessage),
21}
22
23impl FeagiMessage {
24    pub fn serialize_to_byte_container(
25        &self,
26        container: &mut FeagiByteContainer,
27        session_id: AgentID,
28        increment_value: u16,
29    ) -> Result<(), FeagiAgentError> {
30        let json: serde_json::Value = serde_json::to_value(self).unwrap();
31        let feagi_json: FeagiJSON = FeagiJSON::from_json_value(json);
32        container.overwrite_byte_data_with_single_struct_data(&feagi_json, increment_value)?;
33        container.set_agent_identifier(session_id)?;
34        Ok(())
35    }
36}
37
38// TODO we should consider our ownh implementation for feagi messages instead of just piggybacking off of JSON
39// Note: We do not get messages at a high rate. We can simply instantiate on the stack them every time
40impl TryFrom<&FeagiByteContainer> for FeagiMessage {
41    type Error = FeagiAgentError;
42    fn try_from(value: &FeagiByteContainer) -> Result<Self, Self::Error> {
43        let serialized_data = value.try_create_new_struct_from_index(0)?;
44        let feagi_json: FeagiJSON = serialized_data.try_into()?;
45        let json = feagi_json.borrow_json_value().clone();
46        serde_json::from_value(json)
47            .map_err(|err| FeagiAgentError::UnableToDecodeReceivedData(err.to_string()))
48    }
49}
50
51// TODO we should consider our ownh implementation for feagi messages instead of just piggybacking off of JSON
52impl From<FeagiMessage> for FeagiByteContainer {
53    fn from(message: FeagiMessage) -> Self {
54        let json: serde_json::Value = serde_json::to_value(&message).unwrap();
55        let feagi_json: FeagiJSON = FeagiJSON::from_json_value(json);
56        let mut byte_container: FeagiByteContainer = FeagiByteContainer::new_empty();
57        byte_container
58            .overwrite_byte_data_with_single_struct_data(&feagi_json, 0)
59            .unwrap();
60        byte_container
61    }
62}