Я пытаюсь разобраться с этой проблемой довольно долго, и только найденные мной решения действительно ужасны. Должен быть более хороший способ решить эту проблему:
С учетом конфигурации
iterations = 2
tasklist = [
{:system, print: "sth"},
{:system, loop: [
{:device1, run: "cmd" },
{:device2, run: "cmd" },
], iterations: 3},
{:device3, run: "cmd" },
]
Конфигурация обрабатывается сверху вниз, и каждая команда выводит некоторый результат (вывод в файл CSV), кроме {:system, loop: []}
. Определения команд различны и могут включать диапазоны в качестве входных значений.
Я хотел бы создать функцию, которая позволит мне реализовывать вложенные циклы, расширив эту конфигурацию до нового списка шагов без цикла и итераций, но с сохранением этой информации внутри каждого шага. Таким образом, программное обеспечение способно извлечь общее количество итераций и текущий номер итерации из шага, если входное значение шага является диапазоном, и использовать его для выполнения некоторых других вычислений.
Итак, в основном это функция, которая преобразует исходную конфигурацию в такую:
tasklist = [
{:system, print: "sth",mainiteration: 1, maintotalit: 2},
{:device1, run: "cmd" ,loopiteration: 1, looptotalit: 3},
{:device2, run: "cmd" ,loopiteration: 1, looptotalit: 3},
{:device3, run: "cmd" ,mainiteration: 1, maintotalit: 2},
{:system, print: "sth",mainiteration: 1, maintotalit: 2},
{:device1, run: "cmd" ,loopiteration: 2, looptotalit: 3},
{:device2, run: "cmd" ,loopiteration: 2, looptotalit: 3},
{:device3, run: "cmd" ,mainiteration: 1, maintotalit: 2},
{:system, print: "sth",mainiteration: 1, maintotalit: 2},
{:device1, run: "cmd" ,loopiteration: 3, looptotalit: 3},
{:device2, run: "cmd" ,loopiteration: 3, looptotalit: 3},
{:device3, run: "cmd" ,mainiteration: 1, maintotalit: 2},
{:system, print: "sth",mainiteration: 2, maintotalit: 2},
{:device1, run: "cmd" ,loopiteration: 1, looptotalit: 3},
{:device2, run: "cmd" ,loopiteration: 1, looptotalit: 3},
{:device3, run: "cmd" ,mainiteration: 2, maintotalit: 2},
{:system, print: "sth",mainiteration: 2, maintotalit: 2},
{:device1, run: "cmd" ,loopiteration: 2, looptotalit: 3},
{:device2, run: "cmd" ,loopiteration: 2, looptotalit: 3},
{:device3, run: "cmd" ,mainiteration: 2, maintotalit: 2},
{:system, print: "sth",mainiteration: 2, maintotalit: 2},
{:device1, run: "cmd" ,loopiteration: 3, looptotalit: 3},
{:device2, run: "cmd" ,loopiteration: 3, looptotalit: 3},
{:device3, run: "cmd" ,mainiteration: 2, maintotalit: 2},
]
Текущий код, который проходит через шаги конфигурации:
Enum.each(1..iterations, fn n ->
Enum.each(tasklist, fn task ->
IO.inspect(task) # My custom implementation
end)
end)