wslplugins_macro/lib.rs
1#![allow(missing_docs)]
2#![allow(clippy::missing_inline_in_public_items, reason = "Macros")]
3//! Provides procedural macros for WSL plugin development.
4use proc_macro::TokenStream;
5/// Attribute macro for WSL plugin V1.
6///
7/// This macro should be used on an `impl WSLPluginV1` block to register a
8/// plugin implementation and generate the WSL Plugin API entry point.
9///
10/// The attribute accepts one of these required version forms:
11///
12/// - `#[wsl_plugin_v1]`, which does not require a specific minimum WSL Plugin
13/// API version beyond the entry point being available.
14/// - `#[wsl_plugin_v1(major, minor)]`, which requires `major.minor.0`.
15/// - `#[wsl_plugin_v1(major, minor, revision)]`, which requires the exact
16/// `major.minor.revision` minimum version.
17/// - `#[wsl_plugin_v1(capability)]` or
18/// `#[wsl_plugin_v1(capability_a | capability_b)]`, which requires the
19/// minimum version for the listed
20/// [`WSLVersionCapability`](https://docs.rs/wslplugins-rs/latest/wslplugins_rs/enum.WSLVersionCapability.html)
21/// value or values.
22///
23/// # Minimum version example
24/// ```rust, ignore
25/// #[wsl_plugin_v1]
26/// impl WSLPluginV1 for MyPlugin {
27/// // Implementation details
28/// }
29/// ```
30///
31/// # Explicit version example
32/// ```rust, ignore
33/// #[wsl_plugin_v1(2, 1, 3)]
34/// impl WSLPluginV1 for MyPlugin {
35/// // Implementation details
36/// }
37/// ```
38///
39/// # Capability example
40///
41/// This example uses
42/// [`WSLVersionCapability::DistributionRegisteredHook`](https://docs.rs/wslplugins-rs/latest/wslplugins_rs/enum.WSLVersionCapability.html#variant.DistributionRegisteredHook)
43/// (`2.1.2`) and
44/// [`WSLVersionCapability::DistributionUnregisteredHook`](https://docs.rs/wslplugins-rs/latest/wslplugins_rs/enum.WSLVersionCapability.html#variant.DistributionUnregisteredHook)
45/// (`2.1.2`).
46///
47/// ```rust, ignore
48/// #[wsl_plugin_v1(
49/// WSLVersionCapability::DistributionRegisteredHook
50/// | WSLVersionCapability::DistributionUnregisteredHook
51/// )]
52/// impl WSLPluginV1 for MyPlugin {
53/// // Implementation details
54/// }
55/// ```
56#[proc_macro_attribute]
57pub fn wsl_plugin_v1(attr: TokenStream, item: TokenStream) -> TokenStream {
58 wslplugins_macro_core::wsl_plugin_v1(attr.into(), &item.into())
59 .unwrap_or_else(|err| err.to_compile_error())
60 .into()
61}