Sha256: 7dff7fafbae761436fa1f96e83b581a6b8e9cd05cebd86b4719cb65811b03650

Contents?: true

Size: 1.29 KB

Versions: 1

Compression:

Stored size: 1.29 KB

Contents

# frozen_string_literal: true

require_relative 'async_partial/railtie'

module AsyncPartial
  module Renderer
    def render(context, options, block)
      if (options.delete(:async) || (options[:locals]&.delete(:async)))
        AsyncResult.new(Thread.new { super })
      else
        super
      end
    end
  end

  class AsyncResult
    def initialize(thread)
      @thread = thread
    end

    def nil?
      false
    end

    def html_safe?
      true
    end

    def to_s
      val = @thread.value
      @thread.kill
      val
    end
  end

  module ArrayBuffer
    def initialize(*)
      super
      @values = []
    end

    def <<(value)
      @values << [value, :<<] unless value.nil?
      self
    end
    alias :append= :<<

    def safe_concat(value)
      raise ActiveSupport::SafeBuffer::SafeConcatError unless html_safe?
      @values << [value, :safe_concat] unless value.nil?
      self
    end
    alias :safe_append= :safe_concat

    def safe_expr_append=(val)
      @values << [val, :safe_expr_append] unless val.nil?
      self
    end

    def to_s
      result = @values.each_with_object(ActiveSupport::SafeBuffer.new) do |(v, meth), buf|
        if meth == :<<
          buf << v.to_s
        else
          buf.safe_concat(v.to_s)
        end
      end
      result.to_s
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
async_partial-0.2.0 lib/async_partial.rb