aboutsummaryrefslogtreecommitdiff
path: root/src/guff/config.cr
blob: 1be8d8dd19be7595da60655ec096c94de66b1d42 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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