Sha256: 382e7051246f01a1de91cfcf360d67e49ee4c205c33c07f4e73fe4778faeac77

Contents?: true

Size: 1.56 KB

Versions: 1

Compression:

Stored size: 1.56 KB

Contents

module Clouddns
  class DSL
    attr_reader :zones
    attr_reader :fog_options

    def initialize
      @zones = []
      @zone = nil
      @defaults = {}
      @fog_options = {}
    end

    def self.parse_string string
      dsl = DSL.new
      dsl.instance_eval string
      dsl
    end
    def self.parse_file filename
      parse_string open(filename).read
    end

    protected

    record_types = %w{A AAAA CNAME MX NS PTR SOA SPF SRV TXT}
    record_types.each do |type|
      define_method type do |*args|
        add_record type, *args
      end
    end

    def add_record type, name, value, options={}
      name = Utils::parse_domain(name)
      options = @defaults.merge(options)

      value = "\"#{value}\"" if type == 'TXT'

      raise "records must be added inside a zone" unless @zone
      raise "record's dns name must end with the current zone" unless name.end_with? @zone.name

      @zone.records << Record.new(type, name, value, options)
    end

    def zone name
      raise "zones cannot be nested" if @zone

      @zone = Zone.new(Utils::parse_domain(name))
      @zones << @zone
      yield
      @zone = nil
    end

    def defaults options={}
      if block_given?
        old = @defaults
        @defaults = @defaults.merge(options)
        yield
        @defaults = old
      else
        raise "defaults must either take a block or be before any zone declarations" unless @zones.empty?
        @defaults = @defaults.merge(options)
      end
    end

    def provider name, options={}
      @fog_options = options.merge({:provider => name})
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
clouddns-0.0.3 lib/clouddns/dsl.rb