args = System.argv() folder = Enum.at(args, 1) if folder != nil do project_root = Path.expand(folder) File.rm_rf!("#{project_root}/build") File.mkdir_p("#{project_root}/build") # other contents depend on this, so we cant async it bricks = Bricks.collect(project_root) # special case, see module documentation statics_task = Task.async(fn -> Statics.compile(project_root) end) styles_task = Task.async(fn -> Styles.collect(project_root) end) scripts_task = Task.async(fn -> Scripts.collect(project_root) end) pages_task = Task.async(fn -> Pages.collect(project_root, bricks) end) thoughts_task = Task.async(fn -> Thoughts.collect(project_root, bricks) end) [styles, pages, scripts, thoughts] = Task.await_many([styles_task, pages_task, scripts_task, thoughts_task], :infinity) pages_compile_task = Task.async(fn -> Pages.compile(pages) end) styles_compile_task = Task.async(fn -> Styles.compile(styles) end) scripts_compile_task = Task.async(fn -> Scripts.compile(scripts) end) thoughts_compile_task = Task.async(fn -> Thoughts.compile(thoughts) end) Task.await_many( [ pages_compile_task, styles_compile_task, statics_task, scripts_compile_task, thoughts_compile_task ], :infinity ) else IO.puts(:stderr, "The root project folder should be provided on the command line") end