| #!/usr/bin/env node | |
| // | |
| // If you uncomment the line in `zap-generate.js` that looks like this: | |
| // // .then(() => scriptUtil.addToJsonFile('/tmp/gen.log', cmdArgs)) | |
| // then it will produce gen.log file. | |
| // This script can then be used to take that file and produce a sdk.json out of it. | |
| // | |
| // Note: this was used in Matter SDK migration, but it is useful, yet not without | |
| // some modifications for future cases. That's why this script is commited here. | |
| // | |
| // It is NOT part of zap runtime or anything, it's just a quick hack. | |
| const fs = require('fs') | |
| const fsp = fs.promises | |
| const path = require('path') | |
| const os = require('os') | |
| // This points to the root of the SDK. | |
| const sdkRoot = path.join(os.homedir(), 'git/matter') | |
| async function read() { | |
| let data = await fsp.readFile('/tmp/gen.log') | |
| let json = JSON.parse(data) | |
| let allParsed = [] | |
| for (let one of json) { | |
| let parsed = {} | |
| for (let x = 0; x < one.length; x++) { | |
| if (one[x] == '-z') { | |
| parsed.zcl = path.relative(sdkRoot, one[x + 1]) | |
| } else if (one[x] == '-g') { | |
| parsed.gen = path.relative(sdkRoot, one[x + 1]) | |
| } else if (one[x] == '-i') { | |
| parsed.input = path.relative(sdkRoot, one[x + 1]) | |
| } else if (one[x] == '-o') { | |
| parsed.output = path.relative(sdkRoot, one[x + 1]) | |
| } | |
| } | |
| allParsed.push(parsed) | |
| } | |
| let final = {} | |
| final.zcl = {} | |
| for (let one of allParsed) { | |
| if (!Object.values(final.zcl).includes(one.zcl)) { | |
| let key = 'z' + Object.keys(final.zcl).length | |
| if (one.zcl.includes('extensions')) { | |
| key = 'main_ext' | |
| } else { | |
| key = 'main' | |
| } | |
| final.zcl[key] = one.zcl | |
| } | |
| } | |
| final.templates = {} | |
| for (let one of allParsed) { | |
| if (!Object.values(final.templates).includes(one.gen)) { | |
| let key = 't' + Object.keys(final.templates).length | |
| if (one.gen.includes('java')) { | |
| key = 'java' | |
| } else if (one.gen.includes('python')) { | |
| key = 'python' | |
| } else if (one.gen.includes('darwin')) { | |
| if (one.gen.includes('CHIP')) { | |
| key = 'darwin-chip' | |
| } else if (one.gen.includes('test')) { | |
| key = 'darwin-test' | |
| } else { | |
| key = 'darwin' | |
| } | |
| } else if (one.gen.includes('chip-tool')) { | |
| if (one.gen.includes('test')) { | |
| key = 'chip-tool-test' | |
| } else { | |
| key = 'chip-tool' | |
| } | |
| } else if (one.gen.includes('app/common')) { | |
| key = 'app-common' | |
| } else if (one.gen.includes('app/tests')) { | |
| key = 'app-test' | |
| } else if (one.gen.includes('placeholder')) { | |
| key = 'placeholder' | |
| } else if (one.gen.includes('app/zap-templates')) { | |
| key = 'app-zap' | |
| } | |
| final.templates[key] = one.gen | |
| } | |
| } | |
| final.zapFiles = {} | |
| for (let one of allParsed) { | |
| if (!Object.values(final.zapFiles).includes(one.input)) { | |
| let key = 'z' + Object.keys(final.zapFiles).length | |
| if (one.input.includes('controller-clusters.zap')) { | |
| key = 'controller' | |
| } else if (one.input.startsWith('examples/placeholder')) { | |
| if (one.input.includes('app1')) key = 'app1' | |
| else key = 'app2' | |
| } else if (one.input.startsWith('examples/chef')) { | |
| key = path.basename(one.input, '.zap') | |
| key = 'chef_' + key.substring(9, key.length - 11) | |
| } else if (one.input.startsWith('examples')) { | |
| key = path.basename(one.input, '.zap') | |
| } | |
| final.zapFiles[key] = one.input | |
| } | |
| } | |
| final.generation = [] | |
| for (let one of allParsed) { | |
| let out = one.output | |
| let input = Object.keys(final.zapFiles).find( | |
| (key) => final.zapFiles[key] === one.input | |
| ) | |
| let zcl = Object.keys(final.zcl).find((key) => final.zcl[key] === one.zcl) | |
| let template = Object.keys(final.templates).find( | |
| (key) => final.templates[key] === one.gen | |
| ) | |
| let thisOne = { | |
| zapFile: input, | |
| output: out, | |
| zcl: zcl, | |
| template: template | |
| } | |
| // Find existing one with same zapFile and output and zcl | |
| let existing = final.generation.find((x) => { | |
| return ( | |
| x.zapFile == thisOne.zapFile && | |
| x.output == thisOne.output && | |
| x.zcl == thisOne.zcl | |
| ) | |
| }) | |
| if (existing) { | |
| let ct = existing.template | |
| if (Array.isArray(ct)) { | |
| ct.push(thisOne.template) | |
| } else { | |
| existing.template = [existing.template, thisOne.template] | |
| } | |
| } else { | |
| final.generation.push(thisOne) | |
| } | |
| final.generation.sort((a, b) => { | |
| let cmp = a.zapFile.localeCompare(b.zapFile) | |
| if (cmp != 0) return cmp | |
| cmp = a.output.localeCompare(b.output) | |
| if (cmp != 0) return cmp | |
| cmp = a.zcl.localeCompare(b.zcl) | |
| if (cmp != 0) return cmp | |
| return a.template.localeCompare(b.template) | |
| }) | |
| } | |
| console.log(JSON.stringify(final, null, 2)) | |
| } | |
| read().then(() => {}) |