lib/sink/write_lines.ex

defmodule Strom.Sink.WriteLines do
  @behaviour Strom.Sink

  @line_sep "\n"

  defstruct path: nil, file: nil, line_sep: @line_sep

  def new(path, line_sep \\ @line_sep) when is_binary(path) and is_binary(line_sep) do
    %__MODULE__{path: path, line_sep: line_sep}
  end

  @impl true
  def start(%__MODULE__{} = write_lines) do
    file = File.open!(write_lines.path, [:write])
    %{write_lines | file: file}
  end

  @impl true
  def call(%__MODULE__{} = write_lines, data) do
    :ok = IO.write(write_lines.file, data <> write_lines.line_sep)

    {:ok, {[], write_lines}}
  end

  @impl true
  def stop(%__MODULE__{} = write_lines) do
    %{write_lines | file: File.close(write_lines.file)}
  end
end