use std::path::{Path, PathBuf};
use anyhow::{Context, Result};
use tracing::info;
use wit_parser::{Resolve, WorldId};
use crate::parser::{ProjectConfig, TypeConfig};
mod component;
pub use component::*;
mod provider;
use provider::build_provider;
const WASMCLOUD_WASM_TAG_EXPERIMENTAL: &str = "wasmcloud.com/experimental";
#[derive(Debug, Clone, Default)]
pub struct SignConfig {
pub keys_directory: Option<PathBuf>,
pub issuer: Option<String>,
pub subject: Option<String>,
pub disable_keygen: bool,
}
pub async fn build_project(
config: &ProjectConfig,
signing: Option<&SignConfig>,
) -> Result<PathBuf> {
match &config.project_type {
TypeConfig::Component(component_config) => {
build_component(component_config, &config.language, &config.common, signing)
}
TypeConfig::Provider(provider_config) => {
build_provider(provider_config, &config.language, &config.common, signing).await
}
}
}
fn convert_wit_dir_to_world(
dir: impl AsRef<Path>,
world: impl AsRef<str>,
) -> Result<(Resolve, WorldId)> {
let mut resolve = wit_parser::Resolve::default();
let (package_id, _paths) = resolve
.push_dir(dir.as_ref())
.with_context(|| format!("failed to add WIT directory @ [{}]", dir.as_ref().display()))?;
info!("successfully loaded WIT @ [{}]", dir.as_ref().display());
let world_id = resolve
.select_world(package_id, world.as_ref().into())
.context("failed to select world from built resolver")?;
Ok((resolve, world_id))
}