hakanensari/peddler

View on GitHub
lib/peddler/errors/class_generator.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# frozen_string_literal: true

require 'singleton'
require 'peddler/errors/error'

module Peddler
  module Errors
    # @!visibility private
    class ClassGenerator
      include Singleton

      def self.call(name)
        instance.generate(name)
      end

      def initialize
        @mutex = Mutex.new
      end

      def generate(name)
        with_mutex do
          if Errors.const_defined?(name)
            error = Errors.const_get(name)
            return error if error <= Error

            raise TypeError, "#{name} must be a Peddler::Errors::Error"
          end

          Errors.const_set(name, Class.new(Error))
        end
      end

      private

      def with_mutex(&block)
        @mutex.synchronize(&block)
      end
    end
  end
end