summaryrefslogtreecommitdiffstats
path: root/generator/plugins/rust/rust_enum.py
diff options
context:
space:
mode:
Diffstat (limited to 'generator/plugins/rust/rust_enum.py')
-rw-r--r--generator/plugins/rust/rust_enum.py51
1 files changed, 51 insertions, 0 deletions
diff --git a/generator/plugins/rust/rust_enum.py b/generator/plugins/rust/rust_enum.py
new file mode 100644
index 0000000..5773d12
--- /dev/null
+++ b/generator/plugins/rust/rust_enum.py
@@ -0,0 +1,51 @@
+# Copyright (c) Microsoft Corporation. All rights reserved.
+# Licensed under the MIT License.
+
+from typing import List, Union
+
+import generator.model as model
+
+from .rust_commons import TypeData, generate_extras
+from .rust_lang_utils import indent_lines, lines_to_doc_comments, to_upper_camel_case
+
+
+def _get_enum_docs(enum: Union[model.Enum, model.EnumItem]) -> List[str]:
+ doc = enum.documentation.splitlines(keepends=False) if enum.documentation else []
+ return lines_to_doc_comments(doc)
+
+
+def generate_enum(enum: model.Enum, types: TypeData) -> None:
+ is_int = all(isinstance(item.value, int) for item in enum.values)
+
+ lines = (
+ _get_enum_docs(enum)
+ + generate_extras(enum)
+ + [
+ "#[derive(Serialize, Deserialize, PartialEq, Debug, Eq, Clone)]",
+ f"pub enum {enum.name} " "{",
+ ]
+ )
+
+ for item in enum.values:
+ if is_int:
+ field = [
+ f"{to_upper_camel_case(item.name)} = {item.value},",
+ ]
+ else:
+ field = [
+ f'#[serde(rename = "{item.value}")]',
+ f"{to_upper_camel_case(item.name)},",
+ ]
+
+ lines += indent_lines(
+ _get_enum_docs(item) + generate_extras(item) + field + [""]
+ )
+
+ lines += ["}"]
+
+ types.add_type_info(enum, enum.name, lines)
+
+
+def generate_enums(enums: List[model.Enum], types: TypeData) -> None:
+ for enum in enums:
+ generate_enum(enum, types)