blob: 99f45290cc66c6d52f42d780a02afc65d2f2402e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
// Note that we don't yet support `indirect` for enums.
// See https://github.com/mozilla/uniffi-rs/issues/396 for further discussion.
public enum {{ type_name }} {
{% for variant in e.variants() %}
case {{ variant.name()|enum_variant_swift_quoted }}{% if variant.fields().len() > 0 %}({% call swift::field_list_decl(variant) %}){% endif -%}
{% endfor %}
}
public struct {{ ffi_converter_name }}: FfiConverterRustBuffer {
typealias SwiftType = {{ type_name }}
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> {{ type_name }} {
let variant: Int32 = try readInt(&buf)
switch variant {
{% for variant in e.variants() %}
case {{ loop.index }}: return .{{ variant.name()|enum_variant_swift_quoted }}{% if variant.has_fields() %}(
{%- for field in variant.fields() %}
{{ field.name()|arg_name }}: try {{ field|read_fn }}(from: &buf)
{%- if !loop.last %}, {% endif %}
{%- endfor %}
){%- endif %}
{% endfor %}
default: throw UniffiInternalError.unexpectedEnumCase
}
}
public static func write(_ value: {{ type_name }}, into buf: inout [UInt8]) {
switch value {
{% for variant in e.variants() %}
{% if variant.has_fields() %}
case let .{{ variant.name()|enum_variant_swift_quoted }}({% for field in variant.fields() %}{{ field.name()|var_name }}{%- if loop.last -%}{%- else -%},{%- endif -%}{% endfor %}):
writeInt(&buf, Int32({{ loop.index }}))
{% for field in variant.fields() -%}
{{ field|write_fn }}({{ field.name()|var_name }}, into: &buf)
{% endfor -%}
{% else %}
case .{{ variant.name()|enum_variant_swift_quoted }}:
writeInt(&buf, Int32({{ loop.index }}))
{% endif %}
{%- endfor %}
}
}
}
{#
We always write these public functions just in case the enum is used as
an external type by another crate.
#}
public func {{ ffi_converter_name }}_lift(_ buf: RustBuffer) throws -> {{ type_name }} {
return try {{ ffi_converter_name }}.lift(buf)
}
public func {{ ffi_converter_name }}_lower(_ value: {{ type_name }}) -> RustBuffer {
return {{ ffi_converter_name }}.lower(value)
}
{% if !contains_object_references %}
extension {{ type_name }}: Equatable, Hashable {}
{% endif %}
|