reactive_graph_plugin_graphql_schema/query/
plugin.rs1use 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}