76 lines
1.6 KiB
Ruby
76 lines
1.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
module Ci
|
|
module Interpolation
|
|
##
|
|
# Interpolation::Context is a class that represents the data that can be used when performing string interpolation
|
|
# on a CI configuration.
|
|
#
|
|
class Context
|
|
ContextTooComplexError = Class.new(StandardError)
|
|
NotSymbolizedContextError = Class.new(StandardError)
|
|
|
|
MAX_DEPTH = 3
|
|
|
|
def initialize(hash)
|
|
@context = hash
|
|
|
|
raise ContextTooComplexError if depth > MAX_DEPTH
|
|
end
|
|
|
|
def valid?
|
|
errors.none?
|
|
end
|
|
|
|
##
|
|
# This method is here because `Context` will be responsible for validating specs, inputs and defaults.
|
|
#
|
|
def errors
|
|
[]
|
|
end
|
|
|
|
def depth
|
|
deep_depth(@context)
|
|
end
|
|
|
|
def fetch(field)
|
|
@context.fetch(field)
|
|
end
|
|
|
|
def key?(name)
|
|
@context.key?(name)
|
|
end
|
|
|
|
def to_h
|
|
@context.to_h
|
|
end
|
|
|
|
private
|
|
|
|
def deep_depth(context, depth = 0)
|
|
values = context.values.map do |value|
|
|
if value.is_a?(Hash)
|
|
deep_depth(value, depth + 1)
|
|
else
|
|
depth + 1
|
|
end
|
|
end
|
|
|
|
values.max.to_i
|
|
end
|
|
|
|
def self.fabricate(context)
|
|
case context
|
|
when Hash
|
|
new(context)
|
|
when Interpolation::Context
|
|
context
|
|
else
|
|
raise ArgumentError, 'unknown interpolation context'
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|