Sha256: 6cc31c645ab4e5e3f73d6d05a703671ba7f638ea159b6332b2433a5b9e3ed7ef

Contents?: true

Size: 1.47 KB

Versions: 5

Compression:

Stored size: 1.47 KB

Contents

# frozen_string_literal: true

module Wayfarer
  module Config
    class Struct
      module ClassMethods
        attr_accessor :members
      end

      module InstanceMethods
        extend Forwardable

        delegate members: "self.class"

        attr_reader :env

        def initialize(env = ENV)
          @env = env

          define_writers
          define_readers
        end

      private

        def define_writers
          members.each { |key, _| define_writer(key) }
        end

        def define_writer(key)
          define_singleton_method(:"#{key}=") do |val|
            set(key, val)
          end
        end

        def define_readers
          members.each { |key, options| define_reader(key, **options) }
        end

        def define_reader(key, env_key: nil, type: nil, default: nil)
          define_singleton_method(key.to_sym) do
            get(key) || set(key, env_val(env_key, type) || default)
          end
        end

        def env_val(env_key, type)
          return nil unless env_key
          return nil unless env.key?(env_key)

          Strconv.parse(env[env_key], type)
        end

        def get(key)
          instance_variable_get(:"@#{key}")
        end

        def set(key, val)
          instance_variable_set(:"@#{key}", val)
        end
      end

      def self.new(members)
        Class.new do
          include InstanceMethods
          extend ClassMethods

          self.members = members
        end
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
wayfarer-0.4.6 lib/wayfarer/config/struct.rb
wayfarer-0.4.5 lib/wayfarer/config/struct.rb
wayfarer-0.4.4 lib/wayfarer/config/struct.rb
wayfarer-0.4.3 lib/wayfarer/config/struct.rb
wayfarer-0.4.2 lib/wayfarer/config/struct.rb