#![forbid(unsafe_code)]
#[cfg(not(target_arch = "wasm32"))]
compile_error!(
"forge-plugin-sdk only supports wasm32-wasip2. There is no native shim by design \
(see ADR-0004). Plugin integration tests must use forge-test-harness."
);
#[cfg(not(any(feature = "transformer", feature = "generator")))]
compile_error!(
"forge-plugin-sdk: enable either the `transformer` or `generator` feature \
to select a world."
);
pub use forge_ir as ir;
pub use serde_json;
mod convert_impl;
pub mod output;
pub mod types_ext;
pub mod values_ext;
pub use output::{FileMode, GenerationOutput, OutputFile, TransformOutput};
pub use types_ext::{is_canonical_null_id, is_null_typeref, peel_nullable, union_has_null};
pub use values_ext::{resolve, resolve_to_serde, to_json_compact, to_json_pretty};
pub mod config {
#[derive(Debug, thiserror::Error)]
pub enum ConfigError {
#[error("invalid JSON: {0}")]
InvalidJson(String),
#[error("config did not match plugin's declared schema: {0}")]
SchemaMismatch(String),
}
pub fn parse<T: serde::de::DeserializeOwned>(s: &str) -> Result<T, ConfigError> {
serde_json::from_str(s).map_err(|e| ConfigError::InvalidJson(e.to_string()))
}
}
pub mod diag {
use crate::ir::{Diagnostic, Severity, SpecLocation};
pub fn error(code: impl Into<String>, message: impl Into<String>) -> Diagnostic {
Diagnostic {
severity: Severity::Error,
code: code.into(),
message: message.into(),
location: None,
related: vec![],
suggested_fix: None,
}
}
pub fn warning(code: impl Into<String>, message: impl Into<String>) -> Diagnostic {
Diagnostic {
severity: Severity::Warning,
code: code.into(),
message: message.into(),
location: None,
related: vec![],
suggested_fix: None,
}
}
pub fn info(code: impl Into<String>, message: impl Into<String>) -> Diagnostic {
Diagnostic {
severity: Severity::Info,
code: code.into(),
message: message.into(),
location: None,
related: vec![],
suggested_fix: None,
}
}
pub fn hint(code: impl Into<String>, message: impl Into<String>) -> Diagnostic {
Diagnostic {
severity: Severity::Hint,
code: code.into(),
message: message.into(),
location: None,
related: vec![],
suggested_fix: None,
}
}
pub fn at(mut d: Diagnostic, location: SpecLocation) -> Diagnostic {
d.location = Some(location);
d
}
}
#[cfg(feature = "transformer")]
pub mod transformer {
wit_bindgen::generate!({
world: "ir-transformer",
path: "wit",
pub_export_macro: true,
export_macro_name: "export",
});
}
#[cfg(feature = "generator")]
pub mod generator {
wit_bindgen::generate!({
world: "code-generator",
path: "wit",
pub_export_macro: true,
export_macro_name: "export",
});
}
pub mod convert {
#[cfg(feature = "transformer")]
pub mod transformer {
crate::__impl_transformer_world!(
crate::transformer::forge::plugin::types,
crate::transformer::exports::forge::plugin::transformer_api,
crate::transformer::forge::plugin::stage
);
}
#[cfg(feature = "generator")]
pub mod generator {
crate::__impl_generator_world!(
crate::generator::forge::plugin::types,
crate::generator::exports::forge::plugin::generator_api,
crate::generator::forge::plugin::stage
);
}
}