2017-12-21 21:01:00 -05:00
|
|
|
const {spawn} = require('child_process');
|
2017-12-23 18:01:55 -05:00
|
|
|
const process = require('process');
|
2017-12-21 21:01:00 -05:00
|
|
|
|
|
|
|
class RustdocPlugin {
|
|
|
|
constructor(options) {
|
2017-12-23 18:01:55 -05:00
|
|
|
this.options = Object.assign({directories: [], flags: {}}, options);
|
2017-12-21 21:01:00 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
apply(compiler) {
|
2017-12-23 18:01:55 -05:00
|
|
|
let rustdocFlags = [];
|
|
|
|
for (let key in this.options.flags) {
|
|
|
|
if (this.options.flags.hasOwnProperty(key))
|
|
|
|
rustdocFlags.push("--" + key + "=" + this.options.flags[key]);
|
|
|
|
}
|
|
|
|
rustdocFlags = rustdocFlags.join(" ");
|
|
|
|
|
|
|
|
compiler.plugin('after-compile', (compilation, done) => {
|
2017-12-21 21:01:00 -05:00
|
|
|
let directoriesLeft = this.options.directories.length;
|
|
|
|
for (const directory of this.options.directories) {
|
|
|
|
console.log("Building documentation for `" + directory + "`...");
|
2017-12-23 18:01:55 -05:00
|
|
|
const cargo = spawn("cargo", ["doc", "--no-deps"], {
|
|
|
|
cwd: directory,
|
|
|
|
env: Object.assign({RUSTDOCFLAGS: rustdocFlags}, process.env),
|
|
|
|
});
|
2017-12-21 21:01:00 -05:00
|
|
|
cargo.stdout.setEncoding('utf8');
|
|
|
|
cargo.stderr.setEncoding('utf8');
|
|
|
|
cargo.stdout.on('data', data => console.log(data));
|
|
|
|
cargo.stderr.on('data', data => console.log(data));
|
|
|
|
cargo.on('close', code => {
|
|
|
|
if (code !== 0) {
|
|
|
|
const message = "Failed to build documentation for `" + directory + "`!";
|
|
|
|
console.error(message);
|
|
|
|
throw new Error(message);
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log("Built documentation for `" + directory + "`.");
|
|
|
|
directoriesLeft--;
|
|
|
|
if (directoriesLeft === 0)
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = RustdocPlugin;
|