class SecretEnv::Record

Attributes

key[R]

Public Class Methods

new(key:, raw_value:, storage: Storage::Plain.new, dependency: {}) click to toggle source
# File lib/secret_env.rb, line 31
def initialize(key:, raw_value:, storage: Storage::Plain.new, dependency: {})
  @key = key
  @raw_value = raw_value.to_s
  @storage = storage
  @dependency = dependency
end

Public Instance Methods

value() click to toggle source
# File lib/secret_env.rb, line 38
def value
  scanner = StringScanner.new(@raw_value)
  parts = []
  while part = scanner.scan_until(/#\{(.*?)\}/)
    secret_keys = scanner.matched[2..-2] # Extract "secret" from "\#{secret}"

    secret = nil
    secret_keys.split("||").map(&:strip).each do |secret_key|
      secret = case
               when ENV.has_key?(secret_key)
                 ENV[secret_key]
               when @dependency.has_key?(secret_key)
                 # FIXME this code may cause infinite loop
                 @dependency[secret_key].value
               else
                 @storage.retrieve(secret_key)
               end

      break if secret
    end

    raise SecretEnv::KeyNotFound, secret_keys unless secret
    parts << part.gsub(scanner.matched, secret)
  end
  parts << scanner.rest
  parts.join
end