From 290a627b4df7b7ac980efc5c01bfc37e35613b04 Mon Sep 17 00:00:00 2001 From: Dhruv Chandwani Date: Wed, 14 May 2025 18:12:37 -0400 Subject: [PATCH] Adding helpers to generate cluster specific object files --- docs/api.md | 13 +++++++++ docs/helpers.md | 13 +++++++++ src-electron/generator/helper-access.js | 27 +++++++++++++++++++ .../app/zap-templates/templates/app/helper.js | 15 +++++++++++ test/gen-matter-3-1.test.js | 8 ++++++ .../matter3/miscellaneous_helper_tests.zapt | 12 +++++++++ 6 files changed, 88 insertions(+) diff --git a/docs/api.md b/docs/api.md index 52e5bcedcd..24fb60ba60 100644 --- a/docs/api.md +++ b/docs/api.md @@ -8915,6 +8915,7 @@ This module contains the API for templating. For more detailed instructions, rea * [~access_aggregate(options)](#module_Templating API_ Access helpers..access_aggregate) * [~access(options)](#module_Templating API_ Access helpers..access) * [~default_access(options)](#module_Templating API_ Access helpers..default_access) ⇒ + * [~chip_get_access_role(options)](#module_Templating API_ Access helpers..chip_get_access_role) ⇒ string @@ -8979,6 +8980,18 @@ Get the access list information. | --- | --- | | options | \* | + + +### Templating API: Access helpers~chip\_get\_access\_role(options) ⇒ string +Determines the access role for a given entity and operation. + +**Kind**: inner method of [Templating API: Access helpers](#module_Templating API_ Access helpers) +**Returns**: string - The access role. + +| Param | Type | +| --- | --- | +| options | \* | + ## Templating API: Attribute helpers diff --git a/docs/helpers.md b/docs/helpers.md index c86404f8f9..a04a99521f 100644 --- a/docs/helpers.md +++ b/docs/helpers.md @@ -54,6 +54,7 @@ This module contains the API for templating. For more detailed instructions, rea * [~access_aggregate(options)](#module_Templating API_ Access helpers..access_aggregate) * [~access(options)](#module_Templating API_ Access helpers..access) * [~default_access(options)](#module_Templating API_ Access helpers..default_access) ⇒ + * [~chip_get_access_role(options)](#module_Templating API_ Access helpers..chip_get_access_role) ⇒ string @@ -118,6 +119,18 @@ Get the access list information. | --- | --- | | options | \* | + + +### Templating API: Access helpers~chip\_get\_access\_role(options) ⇒ string +Determines the access role for a given entity and operation. + +**Kind**: inner method of [Templating API: Access helpers](#module_Templating API_ Access helpers) +**Returns**: string - The access role. + +| Param | Type | +| --- | --- | +| options | \* | + ## Templating API: Attribute helpers diff --git a/src-electron/generator/helper-access.js b/src-electron/generator/helper-access.js index 88df9a66d9..73c007bf10 100644 --- a/src-electron/generator/helper-access.js +++ b/src-electron/generator/helper-access.js @@ -237,6 +237,33 @@ async function default_access(options) { return templateUtil.templatePromise(this.global, p) } +/** + * Determines the access role for a given entity and operation. + * + * @param {*} options + * @returns {string} The access role. + */ +async function chip_get_access_role(options) { + if (!('op' in options.hash)) { + throw new Error('Access helper requires op from the op="" option.') + } + + const op = options.hash.op + const accessList = await collectAccesslist(this, options) + const accessForOp = accessList.find((a) => a.operation === op) + + if (accessForOp?.role) { + return accessForOp.role + } + + if ('default' in options.hash) { + return options.hash.default + } + + return '' +} + exports.access = access exports.access_aggregate = access_aggregate exports.default_access = default_access +exports.chip_get_access_role = chip_get_access_role diff --git a/src-electron/generator/matter/app/zap-templates/templates/app/helper.js b/src-electron/generator/matter/app/zap-templates/templates/app/helper.js index 98d35ba3ae..40565e7dc7 100644 --- a/src-electron/generator/matter/app/zap-templates/templates/app/helper.js +++ b/src-electron/generator/matter/app/zap-templates/templates/app/helper.js @@ -594,6 +594,20 @@ function asUpperCamelCase(label, options) { const preserveAcronyms = options && options.hash.preserveAcronyms; return asCamelCase(label, false, preserveAcronyms); } +/** + * Same as asUpperCamelCase, but with a special case for "RFID". + * Special case for cluster specific object files for Matter. + * + * @param {*} label + * @param {*} options + * @returns {string} + */ +function chip_name_for_id_usage(label, options) { + if (label == 'RFID') { + return 'Rfid'; + } + return asUpperCamelCase(label, options); +} function chip_friendly_endpoint_type_name(options) { let name = this.endpointTypeName; @@ -1272,6 +1286,7 @@ exports.zcl_commands_that_need_timed_invoke = zcl_commands_that_need_timed_invoke; exports.if_is_fabric_scoped_struct = if_is_fabric_scoped_struct; exports.if_is_non_zero_default = if_is_non_zero_default; +exports.chip_name_for_id_usage = chip_name_for_id_usage; exports.meta = { category: dbEnum.helperCategory.matter, diff --git a/test/gen-matter-3-1.test.js b/test/gen-matter-3-1.test.js index a1bb19855b..597827118f 100644 --- a/test/gen-matter-3-1.test.js +++ b/test/gen-matter-3-1.test.js @@ -570,6 +570,14 @@ test( zclPackageId ) expect(globalBitmap.id).not.toEqual(clusterBitmap.id) + + // Testing chip_get_access_role for attributes + expect(ept).toContain( + 'Name - Acl, Read Privilege - Administer, Write Privilege - Administer' + ) + + // Testing chip_get_access_role for commands + expect(ept).toContain('Name - KeySetWrite, Invoke Privilege - Administer') }, testUtil.timeout.long() ) diff --git a/test/gen-template/matter3/miscellaneous_helper_tests.zapt b/test/gen-template/matter3/miscellaneous_helper_tests.zapt index 4b854bd832..3d9c13aca9 100644 --- a/test/gen-template/matter3/miscellaneous_helper_tests.zapt +++ b/test/gen-template/matter3/miscellaneous_helper_tests.zapt @@ -46,3 +46,15 @@ SemanticTagStruct item {{index}} from Identify cluster: {{name}} {{#if struct_contains_array}} Struct with array: {{name}} {{/if}} {{/zcl_structs}} + +// Test chip_get_access_role for attributes +{{#zcl_attributes_server}} +{{#if clusterRef}} +Name - {{asUpperCamelCase label}}, Read Privilege - {{asUpperCamelCase (chip_get_access_role entity="attribute" op="read" default="view")}}, {{#if isWritableAttribute}}Write Privilege - {{asUpperCamelCase (chip_get_access_role entity="attribute" op="write" default="operate")}}{{/if}} +{{/if}} +{{/zcl_attributes_server}} + +// Test chip_get_access_role for commands +{{#zcl_commands_source_client}} +Name - {{asUpperCamelCase name}}, Invoke Privilege - {{asUpperCamelCase (chip_get_access_role entity="command" op="invoke" default="operate")}} +{{/zcl_commands_source_client}} \ No newline at end of file