spring_ai_rs/ai_interface/callback/
resource.rs

1use std::{error::Error, ffi::CStr};
2
3use serde::{Deserialize, Serialize};
4
5use crate::{ai_interface::AIInterface, get_callback};
6
7#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
8pub struct Resource {
9    pub ai_id: i32,
10    pub resource_id: i32,
11}
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct ResourceInterface {
15    pub ai_id: i32,
16}
17
18#[derive(Debug, Clone, Serialize, Deserialize)]
19pub struct ResourceAll {
20    name: String,
21    optimum: f32,
22    current: f32,
23    income: f32,
24    usage: f32,
25    storage: f32,
26    pull: f32,
27    share: f32,
28    sent: f32,
29    received: f32,
30    excess: f32,
31}
32
33impl AIInterface {
34    pub fn resource_interface(&self) -> ResourceInterface {
35        ResourceInterface { ai_id: self.ai_id }
36    }
37}
38
39impl ResourceInterface {
40    pub fn get_resources(&self) -> Result<Vec<Resource>, Box<dyn Error>> {
41        let get_resources = get_callback!(self.ai_id, getResources)?;
42
43        Ok((0..unsafe { get_resources(self.ai_id) })
44            .map(|i| Resource {
45                ai_id: self.ai_id,
46                resource_id: i,
47            })
48            .collect())
49    }
50}
51
52impl Resource {
53    pub fn name(&self) -> Result<String, Box<dyn Error>> {
54        let get_resource_name = get_callback!(self.ai_id, Resource_getName)?;
55
56        Ok(String::from(
57            unsafe { CStr::from_ptr(get_resource_name(self.ai_id, self.resource_id)) }.to_str()?,
58        ))
59    }
60
61    pub fn optimum(&self) -> Result<f32, Box<dyn Error>> {
62        let get_resource_optimum = get_callback!(self.ai_id, Resource_getOptimum)?;
63        Ok(unsafe { get_resource_optimum(self.ai_id, self.resource_id) })
64    }
65
66    pub fn current(&self) -> Result<f32, Box<dyn Error>> {
67        let get_economy_current = get_callback!(self.ai_id, Economy_getCurrent)?;
68        Ok(unsafe { get_economy_current(self.ai_id, self.resource_id) })
69    }
70
71    pub fn income(&self) -> Result<f32, Box<dyn Error>> {
72        let get_economy_income = get_callback!(self.ai_id, Economy_getIncome)?;
73        Ok(unsafe { get_economy_income(self.ai_id, self.resource_id) })
74    }
75
76    pub fn usage(&self) -> Result<f32, Box<dyn Error>> {
77        let get_economy_usage = get_callback!(self.ai_id, Economy_getUsage)?;
78        Ok(unsafe { get_economy_usage(self.ai_id, self.resource_id) })
79    }
80
81    pub fn storage(&self) -> Result<f32, Box<dyn Error>> {
82        let get_economy_storage = get_callback!(self.ai_id, Economy_getStorage)?;
83        Ok(unsafe { get_economy_storage(self.ai_id, self.resource_id) })
84    }
85
86    pub fn pull(&self) -> Result<f32, Box<dyn Error>> {
87        let get_economy_pull = get_callback!(self.ai_id, Economy_getPull)?;
88        Ok(unsafe { get_economy_pull(self.ai_id, self.resource_id) })
89    }
90
91    pub fn share(&self) -> Result<f32, Box<dyn Error>> {
92        let get_economy_share = get_callback!(self.ai_id, Economy_getShare)?;
93        Ok(unsafe { get_economy_share(self.ai_id, self.resource_id) })
94    }
95
96    pub fn sent(&self) -> Result<f32, Box<dyn Error>> {
97        let get_economy_sent = get_callback!(self.ai_id, Economy_getSent)?;
98        Ok(unsafe { get_economy_sent(self.ai_id, self.resource_id) })
99    }
100
101    pub fn received(&self) -> Result<f32, Box<dyn Error>> {
102        let get_economy_received = get_callback!(self.ai_id, Economy_getReceived)?;
103        Ok(unsafe { get_economy_received(self.ai_id, self.resource_id) })
104    }
105
106    pub fn excess(&self) -> Result<f32, Box<dyn Error>> {
107        let get_economy_excess = get_callback!(self.ai_id, Economy_getExcess)?;
108        Ok(unsafe { get_economy_excess(self.ai_id, self.resource_id) })
109    }
110
111    pub fn all(&self) -> Result<ResourceAll, Box<dyn Error>> {
112        Ok(ResourceAll {
113            name: self.name()?,
114            optimum: self.optimum()?,
115            current: self.current()?,
116            income: self.income()?,
117            usage: self.usage()?,
118            storage: self.storage()?,
119            pull: self.pull()?,
120            share: self.share()?,
121            sent: self.sent()?,
122            received: self.received()?,
123            excess: self.excess()?,
124        })
125    }
126}