The task is to read a configuration file in standard configuration file format,
and set variables accordingly.

For this task, we have a configuration file as follows:

# This is a configuration file in standard configuration file format
#
# Lines beginning with a hash or a semicolon are ignored by the application
# program. Blank lines are also ignored by the application program.

# This is the fullname parameter
FULLNAME Foo Barber

# This is a favourite fruit
FAVOURITEFRUIT banana

# This is a boolean that should be set
NEEDSPEELING

# This boolean is commented out
; SEEDSREMOVED

# Configuration option names are not case sensitive, but configuration parameter
# data is case sensitive and may be preserved by the application program.

# An optional equals sign can be used to separate configuration parameter data
# from the option name. This is dropped by the parser. 

# A configuration option may take multiple parameters separated by commas.
# Leading and trailing whitespace around parameter names and parameter data fields
# are ignored by the application program.

OTHERFAMILY Rhu Barber, Harry Barber



For the task we need to set four variables according to the configuration entries as follows:

fullname = Foo Barber
favouritefruit = banana
needspeeling = true
seedsremoved = false


We also have an option that contains multiple parameters. These may be stored in an array.

 otherfamily(1) = Rhu Barber
 otherfamily(2) = Harry Barber


Related tasks
 Update a configuration file


defmodule Configuration_file do
  def read(file) do
    File.read!(file)
    |> String.split(~r/\n|\r\n|\r/, trim: true)
    |> Enum.reject(fn line -> String.starts_with?(line, ["#", ";"]) end)
    |> Enum.map(fn line ->
         case String.split(line, ~r/\s/, parts: 2) do
           [option]         -> {to_atom(option), true}
           [option, values] -> {to_atom(option), separate(values)}
         end
       end)
  end
 
  def task do
    defaults = [fullname: "Kalle", favouritefruit: "apple", needspeeling: false, seedsremoved: false]
    options = read("configuration_file") ++ defaults
    [:fullname, :favouritefruit, :needspeeling, :seedsremoved, :otherfamily]
    |> Enum.each(fn x ->
         values = options[x]
         if is_boolean(values) or length(values)==1 do
           IO.puts "#{x} = #{values}"
         else
           Enum.with_index(values) |> Enum.each(fn {value,i} ->
             IO.puts "#{x}(#{i+1}) = #{value}"
           end)
         end
       end)
  end
 
  defp to_atom(option), do: String.downcase(option) |> String.to_atom
 
  defp separate(values), do: String.split(values, ",") |> Enum.map(&String.strip/1)
end
 
Configuration_file.task