Skip to main content

poolster_plugin_java/
package.rs

1//! Typed package integration for the existing complete Java generator.
2use anyhow::Result;
3use poolster_core::SdkClientStyle;
4use poolster_core::engine::{
5    Contract, Handle, Language, Meta, Package, Plugin, PluginContext, Provision,
6};
7
8pub struct Java;
9#[derive(Default)]
10pub struct Settings {
11    pub package_name: Option<String>,
12}
13impl Language for Java {
14    const NAME: &'static str = "java";
15    type Settings = Settings;
16    type Workspace = ();
17    fn bundle_middleware(
18        tree: &mut poolster_core::GeneratedTree,
19        middleware: &[poolster_core::customization::BundledMiddleware],
20    ) -> Result<()> {
21        crate::bundled_middleware::bundle(tree, middleware)
22    }
23}
24pub fn package(dir: impl Into<String>) -> Package<Java> {
25    Package::new(dir)
26}
27pub trait PackageExt {
28    fn name(self, name: impl Into<String>) -> Self;
29}
30impl PackageExt for Package<Java> {
31    fn name(mut self, name: impl Into<String>) -> Self {
32        self.settings_mut().package_name = Some(name.into());
33        self
34    }
35}
36/// Native public SDK identity consumed by optional generated-operation tests.
37pub struct NativeSdk {
38    pub namespace: String,
39}
40impl Contract for NativeSdk {
41    const NAME: &'static str = "native-sdk";
42}
43pub struct Sdk {
44    meta: Meta,
45    client_style: Option<SdkClientStyle>,
46    open_enums: bool,
47    preserve_presence: bool,
48}
49pub fn sdk() -> Sdk {
50    Sdk {
51        meta: Meta::new(),
52        client_style: None,
53        open_enums: false,
54        preserve_presence: false,
55    }
56}
57impl Sdk {
58    pub fn preserve_presence(mut self, enabled: bool) -> Self {
59        self.preserve_presence = enabled;
60        self
61    }
62    /// Preserve future wire enum values using extensible value classes.
63    /// Known constants remain available; Java enum switches require the default policy.
64    pub fn open_enums(mut self, enabled: bool) -> Self {
65        self.open_enums = enabled;
66        self
67    }
68    pub fn flat(mut self) -> Self {
69        self.client_style = Some(SdkClientStyle::Flat);
70        self
71    }
72    pub fn namespaced(mut self) -> Self {
73        self.client_style = Some(SdkClientStyle::Namespaced);
74        self
75    }
76}
77impl Sdk {
78    pub fn contract(&self) -> Handle<NativeSdk> {
79        self.meta.handle()
80    }
81}
82impl Plugin<Java> for Sdk {
83    fn kind(&self) -> &'static str {
84        "java-sdk"
85    }
86    fn meta(&self) -> &Meta {
87        &self.meta
88    }
89    fn provides(&self) -> Vec<Provision> {
90        vec![Provision::of::<NativeSdk>()]
91    }
92    fn generate(&self, cx: &mut PluginContext<'_, Java>) -> Result<()> {
93        cx.files.append(crate::presence::render(
94            cx.api,
95            ".",
96            cx.settings.package_name.as_deref(),
97            self.client_style
98                .or(cx.common.client_style)
99                .unwrap_or(SdkClientStyle::Namespaced),
100            self.open_enums,
101            self.preserve_presence,
102        )?)?;
103        cx.publish(NativeSdk {
104            namespace: crate::java_package_name(cx.settings.package_name.as_deref().unwrap_or(
105                &format!("io.poolster.{}", crate::package_segment(&cx.api.name)),
106            )),
107        })
108    }
109}