From 98cc7c41c1d29d5326c79bef09037840e726c156 Mon Sep 17 00:00:00 2001
From: Timotej Ecimovic <timotej.ecimovic@silabs.com>
Date: Tue, 8 Nov 2022 07:51:44 -0500
Subject: [PATCH] Properly implement switch for ZCL metafile loading failures.
 (#790)

---
 src-electron/main-process/startup.js | 25 +++++++++++++++++++------
 src-electron/zcl/zcl-loader.js       | 24 +++++++++++++++++++-----
 2 files changed, 38 insertions(+), 11 deletions(-)

diff --git a/src-electron/main-process/startup.js b/src-electron/main-process/startup.js
index d919805d..d363b53b 100644
--- a/src-electron/main-process/startup.js
+++ b/src-electron/main-process/startup.js
@@ -66,7 +66,9 @@ async function startNormal(quitFunction, argv) {
   mainDatabase = db
 
   try {
-    await zclLoader.loadZclMetafiles(db, argv.zclProperties)
+    await zclLoader.loadZclMetafiles(db, argv.zclProperties, {
+      failOnLoadingError: !argv.noLoadingFailure,
+    })
     let ctx = await generatorEngine.loadTemplates(db, argv.generationTemplate, {
       failOnLoadingError: !argv.noLoadingFailure,
     })
@@ -187,7 +189,9 @@ async function startConvert(argv, options) {
     env.zapVersion()
   )
   options.logger('    🐝 database and schema initialized')
-  await zclLoader.loadZclMetafiles(db, argv.zclProperties)
+  await zclLoader.loadZclMetafiles(db, argv.zclProperties, {
+    failOnLoadingError: !argv.noLoadingFailure,
+  })
   options.logger(`    🐝 zcl package loaded: ${argv.zclProperties}`)
   if (argv.generationTemplate != null) {
     await generatorEngine.loadTemplates(db, argv.generationTemplate, {
@@ -360,7 +364,9 @@ async function startAnalyze(argv, options) {
     env.zapVersion()
   )
   options.logger('    👉 database and schema initialized')
-  await zclLoader.loadZclMetafiles(db, argv.zclProperties)
+  await zclLoader.loadZclMetafiles(db, argv.zclProperties, {
+    failOnLoadingError: !argv.noLoadingFailure,
+  })
   await util.executePromisesSequentially(paths, (singlePath) =>
     importJs
       .importDataFromFile(db, singlePath, {
@@ -399,7 +405,9 @@ async function startServer(argv, quitFunction) {
   })
   mainDatabase = db
   try {
-    await zclLoader.loadZclMetafiles(db, argv.zclProperties)
+    await zclLoader.loadZclMetafiles(db, argv.zclProperties, {
+      failOnLoadingError: !argv.noLoadingFailure,
+    })
     let ctx = await generatorEngine.loadTemplates(db, argv.generationTemplate, {
       failOnLoadingError: !argv.noLoadingFailure,
     })
@@ -445,7 +453,10 @@ async function startSelfCheck(
   options.logger('    👉 database and schema initialized')
   let zclPackageIds = await zclLoader.loadZclMetafiles(
     mainDb,
-    argv.zclProperties
+    argv.zclProperties,
+    {
+      failOnLoadingError: !argv.noLoadingFailure,
+    }
   )
   options.logger(
     `    👉 zcl metadata packlages loaded: ${zclPackageIds.length}`
@@ -559,7 +570,9 @@ async function startGeneration(argv, options) {
     env.zapVersion()
   )
 
-  await zclLoader.loadZclMetafiles(mainDb, zclProperties)
+  await zclLoader.loadZclMetafiles(mainDb, zclProperties, {
+    failOnLoadingError: !argv.noLoadingFailure,
+  })
   let ctx = await generatorEngine.loadTemplates(mainDb, templateMetafile, {
     failOnLoadingError: !argv.noLoadingFailure,
   })
diff --git a/src-electron/zcl/zcl-loader.js b/src-electron/zcl/zcl-loader.js
index 6383c416..62111da5 100644
--- a/src-electron/zcl/zcl-loader.js
+++ b/src-electron/zcl/zcl-loader.js
@@ -74,16 +74,30 @@ async function recordVersion(db, packageId, version, category, description) {
  * @param {*} metadataFile array of paths
  * @returns Array of loaded packageIds.
  */
-async function loadZclMetafiles(db, metadataFiles) {
+async function loadZclMetafiles(
+  db,
+  metadataFiles,
+  options = {
+    failOnLoadingError: true,
+  }
+) {
   let packageIds = []
   if (Array.isArray(metadataFiles)) {
     for (let f of metadataFiles) {
-      let ctx = await loadZcl(db, f)
-      packageIds.push(ctx.packageId)
+      try {
+        let ctx = await loadZcl(db, f)
+        packageIds.push(ctx.packageId)
+      } catch (err) {
+        if (options.failOnLoadingError) throw err
+      }
     }
   } else {
-    let ctx = await loadZcl(db, metadataFiles)
-    packageIds.push(ctx.packageId)
+    try {
+      let ctx = await loadZcl(db, metadataFiles)
+      packageIds.push(ctx.packageId)
+    } catch (err) {
+      if (options.failOnLoadingError) throw err
+    }
   }
   return packageIds
 }
-- 
GitLab