const Handlebars = require('handlebars'); const fs = require('../../core/fs'); const utils = require('../../utils/utils'); const capitalize = string => string.charAt(0).toUpperCase() + string.slice(1); class ScaffoldingSolidity { constructor(embark, options){ this.embark = embark; this.options = options; this.embark.registerDappGenerator('solidity', this.build.bind(this)); } _generateFile(contract, templateFilename, extension, data, overwrite){ const filename = capitalize(contract.className.toLowerCase()) + '.' + extension; const contractDirs = this.embark.config.embarkConfig.contracts; const contractDir = Array.isArray(contractDirs) ? contractDirs[0] : contractDirs; const filePath = fs.dappPath(contractDir.replace(/\*/g, ''), filename); if (!overwrite && fs.existsSync(filePath)){ throw new Error("file '" + filePath + "' already exists"); } const templatePath = utils.joinPath(__dirname, 'templates/' + templateFilename); const source = fs.readFileSync(templatePath).toString(); const template = Handlebars.compile(source); // Write template const result = template(data); fs.writeFileSync(filePath, result); return filePath; } build(contract, overwrite, cb){ try { contract.className = capitalize(contract.className); const filename = contract.className; const filePath = this._generateFile(contract, 'contract.sol.hbs', 'sol', { 'contractName': contract.className, 'structName': contract.className + "Struct", 'fields': Object.keys(contract.fields).map(f => { return {name:f, type: contract.fields[f]}; }) }, overwrite); this.embark.logger.info("contracts/" + filename + ".sol generated"); cb(null, filePath); } catch(error) { this.embark.logger.error(error.message); process.exit(1); } } } module.exports = ScaffoldingSolidity;