reactive_graph_plugin_graphql_schema/query/
plugin.rs

1use std::sync::Arc;
2
3use async_graphql::*;
4use reactive_graph_plugin_api::PLUGIN_NAME_PREFIX;
5use reactive_graph_plugin_service_api::PluginContainerManager;
6use uuid::Uuid;
7
8pub struct GraphQLPlugin {
9    pub id: Uuid,
10}
11
12#[Object(name = "Plugin")]
13impl GraphQLPlugin {
14    async fn id(&self) -> Uuid {
15        self.id
16    }
17
18    async fn stem(&self, context: &Context<'_>) -> Result<String> {
19        let plugin_container_manager = context.data::<Arc<dyn PluginContainerManager + Send + Sync>>()?;
20        plugin_container_manager
21            .get_stem(&self.id)
22            .ok_or_else(|| Error::new("Failed to resolve plugin stem"))
23    }
24
25    async fn path(&self, context: &Context<'_>) -> Result<String> {
26        let plugin_container_manager = context.data::<Arc<dyn PluginContainerManager + Send + Sync>>()?;
27        plugin_container_manager
28            .get_plugin_path(&self.id)
29            .ok_or_else(|| Error::new("Failed to resolve plugin path"))
30    }
31
32    async fn state(&self, context: &Context<'_>) -> Result<String> {
33        let plugin_container_manager = context.data::<Arc<dyn PluginContainerManager + Send + Sync>>()?;
34        plugin_container_manager
35            .get_plugin_state(&self.id)
36            .map(|state| format!("{state:?}"))
37            .ok_or_else(|| Error::new("Failed to resolve plugin state"))
38    }
39
40    async fn name(&self, context: &Context<'_>) -> Result<String> {
41        let plugin_container_manager = context.data::<Arc<dyn PluginContainerManager + Send + Sync>>()?;
42        plugin_container_manager
43            .name(&self.id)
44            .ok_or_else(|| Error::new("Failed to resolve plugin name"))
45    }
46
47    async fn short_name(&self, context: &Context<'_>) -> Result<String> {
48        let plugin_container_manager = context.data::<Arc<dyn PluginContainerManager + Send + Sync>>()?;
49        plugin_container_manager
50            .name(&self.id)
51            .map(|name| name.replace(PLUGIN_NAME_PREFIX, ""))
52            .ok_or_else(|| Error::new("Failed to resolve plugin short name"))
53    }
54
55    async fn description(&self, context: &Context<'_>) -> Result<String> {
56        let plugin_container_manager = context.data::<Arc<dyn PluginContainerManager + Send + Sync>>()?;
57        plugin_container_manager
58            .description(&self.id)
59            .ok_or_else(|| Error::new("Failed to resolve plugin description"))
60    }
61
62    async fn version(&self, context: &Context<'_>) -> Result<String> {
63        let plugin_container_manager = context.data::<Arc<dyn PluginContainerManager + Send + Sync>>()?;
64        plugin_container_manager
65            .version(&self.id)
66            .ok_or_else(|| Error::new("Failed to resolve plugin version"))
67    }
68
69    async fn rustc_version(&self, context: &Context<'_>) -> Result<String> {
70        let plugin_container_manager = context.data::<Arc<dyn PluginContainerManager + Send + Sync>>()?;
71        plugin_container_manager
72            .rustc_version(&self.id)
73            .ok_or_else(|| Error::new("Failed to resolve plugin rustc_version"))
74    }
75
76    async fn plugin_api_version(&self, context: &Context<'_>) -> Result<String> {
77        let plugin_container_manager = context.data::<Arc<dyn PluginContainerManager + Send + Sync>>()?;
78        plugin_container_manager
79            .plugin_api_version(&self.id)
80            .ok_or_else(|| Error::new("Failed to resolve plugin plugin_api_version"))
81    }
82
83    async fn dependencies(&self, context: &Context<'_>) -> Result<Vec<GraphQLPlugin>> {
84        let plugin_container_manager = context.data::<Arc<dyn PluginContainerManager + Send + Sync>>()?;
85        let mut dependencies = Vec::new();
86        for dependency in plugin_container_manager.get_dependencies(&self.id) {
87            if let Some(dependency_id) = plugin_container_manager.get_plugin_by_dependency(&dependency) {
88                dependencies.push(GraphQLPlugin { id: dependency_id })
89            }
90        }
91        Ok(dependencies)
92    }
93
94    async fn unsatisfied_dependencies(&self, context: &Context<'_>) -> Result<Vec<GraphQLPlugin>> {
95        let plugin_container_manager = context.data::<Arc<dyn PluginContainerManager + Send + Sync>>()?;
96        let mut dependencies = Vec::new();
97        for dependency in plugin_container_manager.get_unsatisfied_dependencies(&self.id) {
98            if let Some(dependency_id) = plugin_container_manager.get_plugin_by_dependency(&dependency) {
99                dependencies.push(GraphQLPlugin { id: dependency_id })
100            }
101        }
102        Ok(dependencies)
103    }
104
105    async fn dependents(&self, context: &Context<'_>) -> Result<Vec<GraphQLPlugin>> {
106        let plugin_container_manager = context.data::<Arc<dyn PluginContainerManager + Send + Sync>>()?;
107        let mut dependents = Vec::new();
108        for id in plugin_container_manager.get_dependents(&self.id) {
109            dependents.push(GraphQLPlugin { id })
110        }
111        Ok(dependents)
112    }
113}