"use strict"; const Promise = require("bluebird"); const memoizee = require("memoizee"); const asExpression = require("as-expression"); const fs = Promise.promisifyAll(require("fs")); const lsblk = require("../../packages/exec-lsblk"); const All = require("../../packages/graphql-interface/symbols/all"); const treecutter = require("../../packages/treecutter"); const findInTree = require("../../packages/find-in-tree"); const shallowMerge = require("../../packages/shallow-merge"); const unreachable = require("../../packages/unreachable"); module.exports = function () { let lsblkOnce = memoizee(() => { return Promise.try(() => { return lsblk(); }).then((tree) => { return treecutter.flatten(tree); }).map((device) => { return Promise.try(() => { return fs.realpathAsync(device.path); }).then((actualPath) => { return shallowMerge(device, { path: actualPath }); }); }).then((devices) => { return { tree: treecutter.rebuild(devices), list: devices }; }); }); return function (selectors) { return Promise.try(() => { return lsblkOnce(); }).then(({tree, list}) => { return selectors.map((selector) => { if (selector === All) { // return tree; return list; } else { let { path, name } = selector; let predicate = asExpression(() => { if (path != null) { return (device) => device.path === path; } else if (name != null) { return (device) => device.name === name; } else { unreachable("No selector specified for lsblk"); } }); return findInTree({ tree, predicate }); } }); }); }; };