lib/fluxir.ex

defmodule Fluxir do
  defstruct functions: []

  @doc """
  Convert Fluxir functions to Flux string.
  """
  def to_flux(%__MODULE__{functions: functions}) do
    functions
    |> Enum.map(fn function ->
      function.__struct__.to_flux(function)
    end)
    |> Enum.reverse()
    |> Enum.join("\n|> ")
    |> Kernel.<>("\n")
  end

  @doc """
  Append [from()](https://docs.influxdata.com/flux/v0.x/stdlib/influxdata/influxdb/from/) function to Fluxir functions.
  """
  def from(%__MODULE__{functions: functions} = fluxir \\ %__MODULE__{}, params) do
    new_functions = [Fluxir.Function.Influxdata.Influxdb.From.new(params) | functions]
    %__MODULE__{fluxir | functions: new_functions}
  end

  @doc """
  Append custom function to Fluxir functions.

  iex> Fluxir.Custom("anyFunction(key: value)")
  %Fluxir.Function.Custom{flux: "anyFunction(key: value)"}

  """
  def custom(%__MODULE__{functions: functions} = fluxir \\ %__MODULE__{}, flux) do
    new_functions = [Fluxir.Function.Custom.new(flux) | functions]
    %__MODULE__{fluxir | functions: new_functions}
  end
end