UNPKG

libvirt-node

Version:

The libvirt virtualization API node.js binding

59 lines (51 loc) 1.89 kB
const fs = require('fs'); const xml2js = require('xml2js'); const api_files = require('../tools/api_xml_files'); const { getInterfaceName } = require('./utils'); class ApiParser { constructor(api_xml) { this.raw_xml = fs.readFileSync(api_xml); xml2js.parseString(this.raw_xml, (err, res) => { if(err) throw err; this.raw_json = res; }); this.enums = {}; // exported enums this.functions = {}; // exported functions } parseAll() { if(this.raw_json.api.symbols[0].enum) { this.parseEnums(this.raw_json.api.symbols[0].enum); Object.values(this.enums).forEach(enumArr => { enumArr.sort((a, b) => a.value - b.value) }); } this.parseFunctions(this.raw_json.api.symbols[0].function); console.log('loaded', this.raw_json.api.files[0].file[0].$.name); return this; } parseEnums(enumDescs) { for(let enumDesc of enumDescs) { if(!this.enums[enumDesc.$.type]) { this.enums[enumDesc.$.type] = [enumDesc.$]; } else { this.enums[enumDesc.$.type].push(enumDesc.$); } }; } parseFunctions(funcDescs) { funcDescs.forEach(funcDesc => { this.functions[funcDesc.$.name] = { ...funcDesc.$, iname: getInterfaceName(funcDesc.$.name), info: funcDesc.info[0], args: (funcDesc.arg || []).map(f => f.$), ret: (funcDesc.return || []).map(f => f.$), }; }); } } module.exports = { libvirt_parser: (new ApiParser(api_files.libvirt_api)).parseAll(), libvirt_qemu_parser: (new ApiParser(api_files.libvirt_qemu_api)).parseAll(), libvirt_lxc_parser: (new ApiParser(api_files.libvirt_lxc_api)).parseAll(), }