Объединение данных двух компонентов в один

Я хочу воссоздать программу ls -AlF, но так, как мне нравится, и я хочу использовать для этого NoFlo.

Это график (graphs/ListDirectory.fbp), который я сделал:

ReadDir(filesystem/ReadDir)
Stat(filesystem/Stat)
SplitByStatType(SplitByStatType)
Display(core/Output)

ReadDir OUT -> IN Stat
ReadDir ERROR -> IN Display

Stat OUT -> IN SplitByStatType
Stat ERROR -> IN Display

SplitByStatType DIRECTORY -> IN Display
SplitByStatType FILE -> IN Display

'.' -> SOURCE ReadDir

Это компонент components/SplitByStatType.js:

const noflo = require('noflo')

exports.getComponent = () => {
  const component = new noflo.Component()

  component.description = 'Splits directories and files.'
  component.icon = 'directory'

  component.inPorts.add('in', {
    datatype: 'object',
  })
  component.outPorts.add('file', {
    datatype: 'object',
  })
  component.outPorts.add('directory', {
    datatype: 'object',
  })
  component.outPorts.add('blockdevice', {
    datatype: 'object',
  })
  component.outPorts.add('characterdevice', {
    datatype: 'object',
  })
  component.outPorts.add('fifo', {
    datatype: 'object',
  })
  component.outPorts.add('socket', {
    datatype: 'object',
  })
  component.outPorts.add('error', {
    datatype: 'object',
  })

  component.process((input, output) => {
    if (!input.hasData('in')) return

    const data = input.getData('in')

    const { isFile, isDirectory, isBlockDevice, isCharacterDevice, isFifo, isSocket } = data

    if (isFile) {
      output.send({
        file: data,
      })
    }

    if (isDirectory) {
      output.send({
        directory: data,
      })
    }

    if (isBlockDevice) {
      output.send({
        blockdevice: data,
      })
    }

    if (isCharacterDevice) {
      output.send({
        characterdevice: data,
      })
    }

    if (isFifo) {
      output.send({
        fifo: data,
      })
    }

    if (isSocket) {
      output.send({
        socket: data,
      })
    }

    // TODO: Else, error?

    output.done()
  })

  return component
}
  1. Как бы вы назвали этот компонент и/или кто-то уже сделал его?
  2. Могу ли я сделать это без реализации собственного компонента с использованием других уже существующих компонентов?
  3. Как мне связать вместе имя файла и статистику, чтобы я мог обрабатывать их в другом компоненте и печатать по одной строке для каждого?

В итоге я хочу получить одну строку на узел с каталогами сначала (отсортированными и с /) и последними файлами (также отсортированными и файлами, начинающимися с '.').


person Industrial    schedule 18.05.2020    source источник


Ответы (1)


В noflo-assembly есть утилита слияния, которая делает именно это. Но это также довольно просто сделать с помощью обычного компонента:

const noflo = require('noflo');
exports.getComponent = () => {
  const c = new noflo.Component();
  c.addInport('a');
  c.addInport('b');
  c.addOutport('out');
  return c.process((input, output) => {
    // Check that we have data for both A and B inputs
    if (!input.hasData('a', 'b')) {
      return;
    }
    // Read both inputs
    const [a, b] = input.getData('a', 'b');
    // Send combined data out
    output.sendDone({
      out: {
        a,
        b,
      }
    });
  });
};
person bergie    schedule 25.11.2020