Sha256: 0d775e3f465e30f85ad213d06e51ca4d914f710fe20dea7129c8294cb493dd98

Contents?: true

Size: 1.05 KB

Versions: 1

Compression:

Stored size: 1.05 KB

Contents

# frozen_string_literal: true

require "rack"

module DerivationEndpoint
  class Derivation
    class << self
      def decode(params)
        decoded_data = DerivationEndpoint::Serializer.decode(params)
        path         = decoded_data["path"]
        options      = decoded_data["options"].transform_keys(&:to_sym)

        DerivationEndpoint.config.decoder.call(path, options)
      end
    end

    def call(env)
      request = Rack::Request.new(env)

      return handle_request(request) if request.get? || request.head?

      render_error(405, "Method not allowed")
    end

    private

    def handle_request(request)
      params = request.path_info.split("/").last

      return render_success(params) if params

      render_error(404, "Source not found")
    rescue ArgumentError
      render_error(405, "Method not allowed")
    end

    def render_success(params)
      [302, { "Location" => self.class.decode(params) }, []]
    end

    def render_error(status, message)
      [status, { "Content-Type" => "text/plain" }, [message]]
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
derivation_endpoint-0.1.0 lib/derivation_endpoint/derivation.rb