kotlin_poet_rs/spec/
primary_constructor.rs

1use 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/// Defines [Class's primary constructor](https://kotlinlang.org/docs/classes.html#constructors)
23#[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}