blob: e3a8074bc11a6c28ef6e046c218edbb57bd56904 [file] [log] [blame]
{%- macro encode_value(source, encodable, depth) -%}
{%- if encodable.is_nullable -%}
@Nullable {{encode_value(source, encodable.without_nullable(), depth + 1)}}
{%- elif encodable.is_optional -%}
Optional<{{encode_value(source, encodable.without_optional(), depth + 1)}}>
{%- elif encodable.is_list -%}
ArrayList<{{encode_value(source, encodable.without_list(), depth + 1)}}>
{%- elif encodable.is_struct -%}
{%- set struct = encodable.get_underlying_struct() -%}
ChipStructs.{{source.name}}Cluster{{struct.name}}
{%- else -%}
{{encodable.boxed_java_type}}
{%- endif -%}
{%- endmacro -%}
{%- macro encode_tlv(source, encodable, variable, depth) -%}
{%- if encodable.is_nullable -%}
{{variable}} != null ? {{encode_tlv(source, encodable.without_nullable(), variable, depth + 1)}} : new NullType()
{%- elif encodable.is_optional -%}
{{variable}}.<BaseTLVType>map(({{"nonOptional{}".format(variable)}}) -> {{encode_tlv(source, encodable.without_optional(), "nonOptional{}".format(variable), depth + 1)}}).orElse(new EmptyType())
{%- elif encodable.is_list -%}
ArrayType.generateArrayType({{variable}}, ({{"element{}".format(variable)}}) -> {{encode_tlv(source, encodable.without_list(), "element{}".format(variable), depth + 1)}})
{%- elif encodable.is_struct -%}
{%- set struct = encodable.get_underlying_struct() -%}
{{variable}}.encodeTlv()
{%- else -%}
new {{encodable.java_tlv_type}}Type({{variable}})
{%- endif -%}
{%- endmacro -%}
{%- macro decode_tlv(source, encodable, variable, depth) -%}
{%- if encodable.is_optional -%}
Optional.of({{decode_tlv(source, encodable.without_optional(), variable, depth + 1)}})
{%- elif encodable.is_list -%}
{{variable}}.map(({{"element{}".format(variable)}}) -> {{decode_tlv(source, encodable.without_list(), "element{}".format(variable), depth + 1)}})
{%- elif encodable.is_struct -%}
{%- set struct = encodable.get_underlying_struct() -%}
ChipStructs.{{source.name}}Cluster{{struct.name}}.decodeTlv({{variable}})
{%- else -%}
{{variable}}.value({{encodable.boxed_java_type}}.class)
{%- endif -%}
{%- endmacro -%}
{%- macro get_tlvType(encodable) -%}
{%- if encodable.is_list -%}
Array
{%- elif encodable.is_struct -%}
Struct
{%- else -%}
{{encodable.java_tlv_type}}
{%- endif -%}
{%- endmacro -%}
/*
*
* Copyright (c) 2023 Project CHIP Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package chip.devicecontroller;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Optional;
import static chip.devicecontroller.ChipTLVType.*;
public class ChipEventStructs {
{%- for cluster in clientClusters | sort(attribute='code') -%}
{%- set typeLookup = idl | createLookupContext(cluster) %}
{%- for event in cluster.events %}
public static class {{cluster.name}}Cluster{{event.name}}Event {
{%- for field in event.fields %}
{%- set encodable = field | asEncodable(typeLookup) %}
public {{encode_value(cluster, encodable, 0)}} {{field.name}};
{%- endfor %}
{%- for field in event.fields %}
{%- set encodable = field | asEncodable(typeLookup) %}
private static final long {{field.name | constcase}}_ID = {{field.code}}L;
{%- endfor %}
public {{cluster.name}}Cluster{{event.name}}Event(
{%- for field in event.fields %}
{%- set encodable = field | asEncodable(typeLookup) %}
{{encode_value(cluster, encodable, 0)}} {{field.name}}
{%- if loop.index0 < loop.length - 1 -%}{{","}}{%- endif -%}
{%- endfor %}
) {
{%- for field in event.fields %}
{%- set encodable = field | asEncodable(typeLookup) %}
this.{{field.name}} = {{field.name}};
{%- endfor %}
}
public StructType encodeTlv() {
ArrayList<StructElement> values = new ArrayList<>();
{%- for field in event.fields %}
{%- set encodable = field | asEncodable(typeLookup) %}
values.add(new StructElement({{field.name | constcase}}_ID, {{encode_tlv(cluster, encodable, field.name, 0)}}));
{%- endfor %}
return new StructType(values);
}
public static {{cluster.name}}Cluster{{event.name}}Event decodeTlv(BaseTLVType tlvValue) {
if (tlvValue == null || tlvValue.type() != TLVType.Struct) {
return null;
}
{%- for field in event.fields %}
{%- set encodable = field | asEncodable(typeLookup) %}
{%- set encodable2 = field | asEncodable(typeLookup) %}
{{encode_value(cluster, encodable, 0)}} {{field.name | lowfirst_except_acronym}}
{%- if encodable2.is_nullable -%}
{{" = null"}}
{%- elif encodable2.is_optional -%}
{{" = Optional.empty()"}}
{%- else -%}
{{" = null"}}
{%- endif -%}
;
{%- endfor %}
{%- if event.fields %}
for (StructElement element: ((StructType)tlvValue).value()) {
{%- for field in event.fields -%}
{%- set encodable = field | asEncodable(typeLookup) %}
{% if loop.index0 > 0 -%}{{"} else "}}{%- endif -%}if (element.contextTagNum() == {{field.name | constcase}}_ID) {
if (element.value(BaseTLVType.class).type() == TLVType.{{get_tlvType(encodable)}}) {
{{get_tlvType(encodable)}}Type castingValue = element.value({{get_tlvType(encodable)}}Type.class);
{{field.name | lowfirst_except_acronym}} = {{decode_tlv(cluster, encodable, "castingValue", 0)}};
}
{%- endfor -%}
{% raw %}
}
{%- endraw %}
}
{%- endif %}
return new {{cluster.name}}Cluster{{event.name}}Event(
{%- for field in event.fields %}
{{field.name}}{%- if loop.index0 < loop.length - 1 -%}{{","}}{%- endif %}
{%- endfor %}
);
}
@Override
public String toString() {
StringBuilder output = new StringBuilder();
output.append("{{cluster.name}}Cluster{{event.name}}Event {\n");
{%- for field in event.fields %}
{%- set encodable = field | asEncodable(typeLookup) %}
output.append("\t{{field.name}}: ");
{%- if encodable.is_list %}
output.append({{field.name}});
{%- elif encodable.is_octet_string %}
{%- if encodable.is_optional %}
output.append({{field.name}}.isPresent() ? Arrays.toString({{field.name}}.get()) : "");
{%- else %}
output.append(Arrays.toString({{field.name}}));
{%- endif %}
{%- else %}
output.append({{field.name}});
{%- endif %}
output.append("\n");
{%- endfor %}
output.append("}\n");
return output.toString();
}
}
{%- endfor %}
{%- endfor %}
}