Sha256: db83fdbab02a67c0c890c00e9c6b4875a52137ce18774dae011d51b78ae7ce6d

Contents?: true

Size: 1.76 KB

Versions: 4

Compression:

Stored size: 1.76 KB

Contents

module Astrails
  module Safe
    module Config
      class Builder
        COLLECTIONS = %w/database archive/
        ITEMS = %w/s3 key secret bucket path gpg password keep local mysqldump options
        user socket tar files exclude filename/
        NAMES = COLLECTIONS + ITEMS
        def initialize(node)
          @node = node
        end

        # supported args:
        #   args = [value]
        #   args = [id, data]
        #   args = [data]
        # id/value - simple values, data - hash
        def method_missing(sym, *args, &block)
          return super unless NAMES.include?(sym.to_s)

          # do we have id or value?
          unless args.first.is_a?(Hash)
            id_or_value = args.shift # nil for args == []
          end

          # do we have data hash?
          if data = args.shift
            die "#{sym}: hash expected: #{data.inspect}" unless data.is_a?(Hash)
          end

          #puts "#{sym}: args=#{args.inspect}, id_or_value=#{id_or_value}, data=#{data.inspect}, block=#{block.inspect}"

          die "#{sym}: unexpected: #{args.inspect}" unless args.empty?
          die "#{sym}: missing arguments" unless id_or_value || data || block

          if COLLECTIONS.include?(sym.to_s) && id_or_value
            data ||= {}
          end

          if !data && !block
            # simple value assignment
            @node[sym] = id_or_value

          elsif id_or_value
            # collection element with id => create collection node and a subnode in it
            key = sym.to_s + "s"
            collection = @node[key] || @node.set(key, {})
            collection.set(id_or_value, data || {}, &block)

          else
            # simple subnode
            @node.set(sym, data || {}, &block)
          end
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
astrails-safe-0.1.1 lib/astrails/safe/config/builder.rb
astrails-safe-0.1.2 lib/astrails/safe/config/builder.rb
astrails-safe-0.1.3 lib/astrails/safe/config/builder.rb
astrails-safe-0.1.4 lib/astrails/safe/config/builder.rb