11import re
2+ from dataclasses import dataclass
3+ from typing import List , Optional
4+
5+ from src .header_generator import set_package
6+
7+
8+ @dataclass
9+ class EnumClass :
10+ name : str
11+ values : List [str ]
12+ description : Optional [str ] = None
13+
14+
15+ indent_lvl1 = " "
16+ indent_lvl2 = indent_lvl1 * 2
17+ indent_lvl3 = indent_lvl1 * 3
218
319
420def to_java_constant (value : str ) -> str :
@@ -9,3 +25,116 @@ def to_java_constant(value: str) -> str:
925 value = re .sub (r"([0-9])([A-Za-z])" , r"\1_\2" , value ) # 9a / 9A -> 9_A
1026
1127 return value .upper ()
28+
29+
30+ def generate_enum_class (enum_class : EnumClass , package : str ) -> str :
31+ enum_body = [
32+ set_package (package ),
33+ "" ,
34+ f"import java.util.HashMap;" ,
35+ f"import java.util.Map;" ,
36+ f""
37+ ]
38+
39+ enum_body .extend (_get_javadoc (enum_class .description ))
40+
41+ enum_body .append (f"public enum { enum_class .name } {{" )
42+ enum_body .extend (_get_constants (enum_class .values ))
43+
44+ enum_body .append (f"" )
45+ enum_body .append (f"{ indent_lvl1 } private final static Map<String, { enum_class .name } > CONSTANTS = new HashMap<String, { enum_class .name } >();" )
46+ enum_body .append (f"" )
47+ enum_body .extend (_get_static_method (enum_class .name ))
48+
49+ enum_body .append (f"" )
50+ enum_body .append (f"{ indent_lvl1 } private final String value;" )
51+ enum_body .append (f"" )
52+ enum_body .extend (_get_constructor (enum_class .name ))
53+
54+ enum_body .append (f"" )
55+ enum_body .extend (_get_fromValue_method (enum_class .name ))
56+
57+ enum_body .append (f"" )
58+ enum_body .extend (_get_toString_method ())
59+
60+ enum_body .append (f"" )
61+ enum_body .extend (_get_value_method ())
62+ enum_body .append ("}" )
63+ enum_body .append (f"" )
64+
65+ return "\n " .join (enum_body )
66+
67+
68+ def _get_javadoc (description : str ) -> List [str ]:
69+ javadoc = ["" ]
70+ if description is not None :
71+ javadoc = [
72+ "" ,
73+ "/**" ,
74+ f" * { description } " ,
75+ " */"
76+ ]
77+ return javadoc
78+
79+
80+ def _get_constants (constants : List [str ]) -> List [str ]:
81+ values = []
82+ for i , value in enumerate (constants ):
83+ line_end = ";" if i == (len (constants ) - 1 ) else ","
84+ values .append (
85+ f'{ indent_lvl1 } { to_java_constant (value )} ("{ value } "){ line_end } '
86+ )
87+ return values
88+
89+
90+ def _get_static_method (class_name : str ) -> List [str ]:
91+ body = [
92+ f"{ indent_lvl1 } static {{" ,
93+ f"{ indent_lvl2 } for ({ class_name } c : values()) {{" ,
94+ f"{ indent_lvl3 } CONSTANTS.put(c.value, c);" ,
95+ f"{ indent_lvl2 } }}" ,
96+ f"{ indent_lvl1 } }}"
97+ ]
98+ return body
99+
100+
101+ def _get_constructor (class_name : str ) -> List [str ]:
102+ body = [
103+ f"{ indent_lvl1 } { class_name } (String value) {{" ,
104+ f"{ indent_lvl2 } this.value = value;" ,
105+ f"{ indent_lvl1 } }}"
106+ ]
107+ return body
108+
109+
110+ def _get_fromValue_method (class_name : str ) -> List [str ]:
111+ body = [
112+ f"{ indent_lvl1 } public static { class_name } fromValue(String value) {{" ,
113+ f"{ indent_lvl2 } { class_name } constant = CONSTANTS.get(value);" ,
114+ f"{ indent_lvl2 } if (constant == null) {{" ,
115+ f"{ indent_lvl3 } throw new IllegalArgumentException(value);" ,
116+ f"{ indent_lvl2 } }} else {{" ,
117+ f"{ indent_lvl3 } return constant;" ,
118+ f"{ indent_lvl2 } }}" ,
119+ f"{ indent_lvl1 } }}"
120+ ]
121+ return body
122+
123+
124+ def _get_toString_method () -> List [str ]:
125+ body = [
126+ f"{ indent_lvl1 } @Override" ,
127+ f"{ indent_lvl1 } public String toString() {{" ,
128+ f"{ indent_lvl2 } return this.value;" ,
129+ f"{ indent_lvl1 } }}"
130+ ]
131+ return body
132+
133+
134+ def _get_value_method () -> List [str ]:
135+ body = [
136+ f"{ indent_lvl1 } public String value() {{" ,
137+ f"{ indent_lvl2 } return this.value;" ,
138+ f"{ indent_lvl1 } }}"
139+ ]
140+ return body
0 commit comments