require "option_parser" module Guff class Config DEFAULTS = { "host": "localhost", "port": "8989", "data": "./data", "public": "./public", "environment": "development", } DIRS = %w{ data public } def initialize(app, args) @data = defaults parse_args(app, args) end def [](key : String) : String @data[key] end def []=(key : String, val : String | Nil) : String @data[key] = val end private def defaults : Hash(String, String) DEFAULTS.merge(DEFAULTS.keys.reduce({} of String => String) do |r, key| env_key = "GUFF_" + key.upcase r[key] = ENV[env_key] if ENV.has_key?(env_key) r end) end private def parse_args(app, args) OptionParser.parse(args) do |p| p.on( "-h HOST", "--host HOST", "Host (defaults to \"localhost\")." ) do |host| self["host"] = host end p.on( "-p PORT", "--port PORT", "Port (defaults to 8989)." ) do |port| self["port"] = port end p.on( "-d PATH", "--data-dir PATH", "Path to data directory (defaults to \"./data\")." ) do |path| self["data"] = path end p.on( "-u PATH", "--public-dir PATH", "Path to public directory (defaults to \"./public\")." ) do |path| self["public"] = path end p.on( "-e ENV", "--environment ENV", "Environment (defaults to \"development\")." ) do |path| self["public"] = path end p.on( "--help", "Print usage" ) do puts p.to_s exit 0 end end # expand output directory paths and create them %w{data public}.each do |key| self[key] = File.expand_path(File.join(File.dirname(app), self[key])) # puts "DEBUG: %s: %s" % [key, self[key]] Dir.mkdir(self[key], 0o770) unless File.directory?(self[key]) end end end end