Sha256: 655b63ce7161cb38bea29a49251b8630c1bd644f120a5b70cb0e3f35981bfa6f

Contents?: true

Size: 1.12 KB

Versions: 2

Compression:

Stored size: 1.12 KB

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 = :object, prefix = nil, &block)
        link.schemas[prefix] = Schema.new(type, link.schema).tap { |s| s.setup &block }
      end

      def target_schema(type = :object, &block)
        schema type, :target, &block
      end

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

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
jimmy-0.4.1 lib/jimmy/link.rb
jimmy-0.4 lib/jimmy/link.rb