use tokio::fs;
use super::types::{OwnedTaskMetadata, OwnedTaskMetadataCollection};
use super::TaskRegistrar;
use crate::registry::error::LoaderError;
use crate::registry::loader::package_loader::get_library_extension;
impl TaskRegistrar {
pub(super) async fn extract_task_metadata_from_library(
&self,
package_data: &[u8],
) -> Result<OwnedTaskMetadataCollection, LoaderError> {
let library_extension = get_library_extension();
let temp_path = self
.temp_dir
.path()
.join(format!("metadata_extract.{}", library_extension));
fs::write(&temp_path, package_data)
.await
.map_err(|e| LoaderError::FileSystem {
path: temp_path.to_string_lossy().to_string(),
error: e.to_string(),
})?;
let loaded = fidius_host::loader::load_library(&temp_path).map_err(
|e: fidius_host::LoadError| LoaderError::LibraryLoad {
path: temp_path.to_string_lossy().to_string(),
error: e.to_string(),
},
)?;
let plugin =
loaded
.plugins
.into_iter()
.next()
.ok_or_else(|| LoaderError::MetadataExtraction {
reason: "Plugin library contains no plugins".to_string(),
})?;
let handle = fidius_host::PluginHandle::from_loaded(plugin);
let metadata: cloacina_workflow_plugin::PackageTasksMetadata =
handle
.call_method(0, &())
.map_err(|e| LoaderError::MetadataExtraction {
reason: format!("Failed to call get_task_metadata: {}", e),
})?;
let task_count = metadata.tasks.len();
let tasks: Vec<OwnedTaskMetadata> = metadata
.tasks
.into_iter()
.map(|t| OwnedTaskMetadata {
local_id: t.id,
dependencies_json: serde_json::to_string(&t.dependencies)
.unwrap_or_else(|_| "[]".to_string()),
})
.collect();
tracing::debug!(
"Extracted metadata via fidius: package={}, workflow={}, task_count={}",
metadata.package_name,
metadata.workflow_name,
task_count
);
Ok(OwnedTaskMetadataCollection {
workflow_name: metadata.workflow_name,
package_name: metadata.package_name,
tasks,
})
}
}