Sha256: 1ca5623f0de44a4b58e053fd8957af2e52da541c64a0d274a68ac458ed57e176

Contents?: true

Size: 1.32 KB

Versions: 5

Compression:

Stored size: 1.32 KB

Contents

require "dry/core/class_builder"
require "dry/types"
require "dry/struct"

require "dry/system/settings/file_loader"

module Dry
  module System
    module Settings
      class DSL < BasicObject
        attr_reader :identifier

        attr_reader :schema

        def initialize(identifier, &block)
          @identifier = identifier
          @schema = {}
          instance_eval(&block)
        end

        def call
          Core::ClassBuilder.new(name: 'Configuration', parent: Settings::Configuration).call do |klass|
            schema.each do |key, type|
              klass.setting(key, type)
            end
          end
        end

        def key(name, type)
          schema[name] = type
        end
      end

      class Configuration < Dry::Struct
        constructor_type :strict_with_defaults

        def self.setting(*args)
          attribute(*args)
        end

        def self.load(root, env)
          env_data = load_files(root, env)

          attributes = schema.each_with_object({}) do |(key, type), h|
            value = ENV.fetch(key.to_s.upcase) { env_data[key.to_s.upcase] }
            h[key] = value
          end

          new(attributes)
        end

        def self.load_files(root, env)
          FileLoader.new.(root, env)
        end
        private_class_method :load_files
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
dry-system-0.9.2 lib/dry/system/settings.rb
dry-system-0.9.1 lib/dry/system/settings.rb
dry-system-0.9.0 lib/dry/system/settings.rb
dry-system-0.8.1 lib/dry/system/settings.rb
dry-system-0.8.0 lib/dry/system/settings.rb