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


import "io" for File
import "/ioutil" for FileUtil
 
class Configuration {
    construct new(map) {
        _fullName       = map["fullName"]
        _favouriteFruit = map["favouriteFruit"]
        _needsPeeling   = map["needsPeeling"]
        _seedsRemoved   = map["seedsRemoved"]
        _otherFamily    = map["otherFamily"]
    }
 
    toString {
        return [
            "Full name       = %(_fullName)",
            "Favourite fruit = %(_favouriteFruit)",
            "Needs peeling   = %(_needsPeeling)",
            "Seeds removed   = %(_seedsRemoved)",
            "Other family    = %(_otherFamily)"
        ].join("\n")
    }
}
 
var commentedOut = Fn.new { |line| line.startsWith("#") || line.startsWith(";") }
 
var toMapEntry = Fn.new { |line|
    var ix = line.indexOf(" ")
    if (ix == -1) return MapEntry.new(line, "")
    return MapEntry.new(line[0...ix], line[ix+1..-1])
}
 
var fileName = "configuration.txt"
var lines = File.read(fileName).trimEnd().split(FileUtil.lineBreak)
var mapEntries = lines.map   { |line| line.trim() }.
                       where { |line| line != "" }.
                       where { |line| !commentedOut.call(line) }.
                       map   { |line| toMapEntry.call(line) }
var configurationMap = { "needsPeeling": false, "seedsRemoved": false }
for (me in mapEntries) {
    if (me.key == "FULLNAME") {
        configurationMap["fullName"] = me.value
    } else if (me.key == "FAVOURITEFRUIT") {
        configurationMap["favouriteFruit"] = me.value
    } else if (me.key == "NEEDSPEELING") {
        configurationMap["needsPeeling"] = true
    } else if (me.key == "OTHERFAMILY") {
        configurationMap["otherFamily"] = me.value.split(" , ").map { |s| s.trim() }.toList
    } else if (me.key == "SEEDSREMOVED") {
        configurationMap["seedsRemoved"] = true
    } else {
        System.print("Encountered unexpected key %(me.key)=%(me.value)")
    }
}
System.print(Configuration.new(configurationMap))