poolster_plugin_java/
package.rs1use 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}
36pub 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 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}