Sha256: 6ffd0d1b348d251572fa89b4ab8d22bf15991a469e816031824091b7a693a558

Contents?: true

Size: 1.89 KB

Versions: 1

Compression:

Stored size: 1.89 KB

Contents

# frozen_string_literal: true

module Confset
  module Sources
    # Allows settings to be loaded from a "flat" hash with string keys, like ENV.
    class EnvSource
      attr_reader :prefix
      attr_reader :separator
      attr_reader :converter
      attr_reader :parse_values

      def initialize(env,
                     prefix: Confset.env_prefix || Confset.const_name,
                     separator: Confset.env_separator,
                     converter: Confset.env_converter,
                     parse_values: Confset.env_parse_values)
        @env = env
        @prefix = prefix.to_s.split(separator)
        @separator = separator
        @converter = converter
        @parse_values = parse_values
      end

      def load
        return {} if @env.nil? || @env.empty?

        hash = Hash.new

        @env.each do |variable, value|
          keys = variable.to_s.split(separator)

          next if keys.shift(prefix.size) != prefix

          keys.map! { |key|
            case converter
            when :downcase then
              key.downcase
            when nil then
              key
            else
              raise "Invalid ENV variables name converter: #{converter}"
            end
          }

          leaf = keys[0...-1].inject(hash) { |h, key|
            h[key] ||= {}
          }

          unless leaf.is_a?(Hash)
            conflicting_key = (prefix + keys[0...-1]).join(separator)
            raise "Environment variable #{variable} conflicts with variable #{conflicting_key}"
          end

          leaf[keys.last] = parse_values ? __value(value) : value
        end

        hash
      end

      private
        # Try to convert string to a correct type
        def __value(v)
          case v
          when "false"
            false
          when "true"
            true
          else
            Integer(v) rescue Float(v) rescue v
          end
        end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
confset-1.0.0 lib/confset/sources/env_source.rb