Sha256: 0f5457e8461975a2d9eb1a5bdd3dd9280a501708023f3e86a6c219ce18231c5e

Contents?: true

Size: 1015 Bytes

Versions: 3

Compression:

Stored size: 1015 Bytes

Contents

module Jimmy
  class Link < Hash
    attr_reader :schema

    def initialize(schema, rel, href)
      @schema = schema
      merge! 'rel'  => rel.to_s,
             'href' => href.to_s
    end

    def dsl
      @dsl ||= DSL.new(self)
    end

    def schemas
      @schemas ||= {}
    end

    def domain
      schema.domain
    end

    def compile
      merge schemas.map { |k, v| [(k ? "#{k}Schema" : 'schema'), v.compile] }.to_h
    end

    class DSL
      attr_reader :link

      def initialize(link)
        @link = link
      end

      def domain
        link.domain
      end

      def title(value)
        link['title'] = value
      end

      def method(value)
        link['method'] = value.to_s.upcase
      end

      def evaluate(&block)
        instance_exec &block
      end

      def schema(type = nil, &block)
        link.schemas[type] = Schema.new(:object, domain, {}, &block)
      end

      def set(**values)
        values.each { |k, v| link[k.to_s] = v }
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
jimmy-0.3.3 lib/jimmy/link.rb
jimmy-0.3.2 lib/jimmy/link.rb
jimmy-0.3.1 lib/jimmy/link.rb