kotlin_poet_rs/spec/
primary_constructor.rs1use crate::io::RenderKotlin;
2use crate::spec::{VisibilityModifier, CodeBlock, Parameter, Property};
3use crate::tokens;
4
5#[derive(Debug, Clone)]
6enum PrimaryConstructorParameter {
7 PropertyParameter(Property),
8 FunctionLike(Parameter),
9}
10
11impl RenderKotlin for PrimaryConstructorParameter {
12 fn render_into(&self, block: &mut CodeBlock) {
13 match self {
14 PrimaryConstructorParameter::PropertyParameter(property) =>
15 block.push_renderable(property),
16 PrimaryConstructorParameter::FunctionLike(param) =>
17 block.push_renderable(param)
18 }
19 }
20}
21
22#[derive(Debug, Clone)]
24pub struct PrimaryConstructor {
25 arguments: Vec<PrimaryConstructorParameter>,
26 visibility_modifier: VisibilityModifier,
27}
28
29impl PrimaryConstructor {
30 pub fn new() -> PrimaryConstructor {
31 PrimaryConstructor {
32 arguments: Vec::new(),
33 visibility_modifier: VisibilityModifier::default(),
34 }
35 }
36
37 pub fn parameter(mut self, parameter: Parameter) -> PrimaryConstructor {
38 self.arguments.push(PrimaryConstructorParameter::FunctionLike(parameter));
39 self
40 }
41
42 pub fn property(mut self, property: Property) -> PrimaryConstructor {
43 self.arguments.push(PrimaryConstructorParameter::PropertyParameter(property));
44 self
45 }
46
47 pub fn visibility_modifier(mut self, visibility_modifier: VisibilityModifier) -> PrimaryConstructor {
48 self.visibility_modifier = visibility_modifier;
49 self
50 }
51}
52
53impl RenderKotlin for PrimaryConstructor {
54 fn render_into(&self, block: &mut CodeBlock) {
55 block.push_renderable(&self.visibility_modifier);
56 block.push_space();
57 block.push_static_atom(tokens::keyword::CONSTRUCTOR);
58 block.push_round_brackets(|params_block| {
59 params_block.push_comma_separated(&self.arguments)
60 });
61 }
62}
63
64#[cfg(test)]
65mod tests {
66 use crate::io::RenderKotlin;
67 use crate::spec::{VisibilityModifier, CodeBlock, Parameter, PrimaryConstructor, Property, Type};
68
69 #[test]
70 fn primary_constructor_test() {
71 let property = Property::new(
72 "name",
73 Type::string(),
74 ).initializer(
75 CodeBlock::atom("\"\"")
76 );
77
78 let function_parameter = Parameter::new(
79 "age",
80 Type::int(),
81 );
82
83 let primary_constructor = PrimaryConstructor::new()
84 .property(property)
85 .parameter(function_parameter);
86
87 assert_eq!(
88 primary_constructor.render_string(),
89 "public constructor(public final val name: kotlin.String = \"\", age: kotlin.Int)"
90 );
91 }
92
93 #[test]
94 fn test_private_constructor() {
95 let primary_constructor = PrimaryConstructor::new()
96 .visibility_modifier(VisibilityModifier::Private);
97
98 assert_eq!(
99 primary_constructor.render_string(),
100 "private constructor()"
101 );
102 }
103}