# frozen_string_literal: true require 'logger' module Crate module Hook def _hook_convert_impl(name, **options, &block) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/LineLength _log(**_options, name: _name(name), **options, severity: Logger::DEBUG) before_value = _raw[name] after_value = instance_exec(before_value, &block) return if before_value == after_value not_set = !_raw.key?(name) _raw[name] = after_value before_message = not_set ? 'not set' : before_value.inspect _log(**_options, name: _name(name), tag: 'convert', severity: Logger::INFO, **options) do "was #{before_message} and is now #{after_value.inspect}" end end def _hook_convert(name, **options, &block) _hook_convert_impl(name, **options, &block) end def _hook_default(name, *args, **options, &block) default, = args block ||= proc { default } _hook_convert_impl(name, **options) do |before| _raw.key?(name) ? before : block.call end end def _type_convert(klass) Kernel.method(klass.to_s.to_sym) end def _hook_type(name, klass, **options) _hook_convert_impl(name, **options) do |before| _type_convert(klass).call(before) end end def _hook_strip(name, **options) _hook_convert_impl(name, **options, &:strip) end def _hook_required(name, **options) _log(**_options, name: _name(name), **options, severity: Logger::DEBUG) return if _raw.key?(name) _log(**_options, name: _name(name), severity: Logger::FATAL, **options) do 'is not set' end exit 1 end def _hook_must_be(name, klass, **options) _log(**_options, name: _name(name), **options, severity: Logger::DEBUG) return if _raw[name].is_a?(klass) _log(**_options, name: _name(name), severity: Logger::FATAL, **options) do "must be #{klass} but is #{_raw[name].class}" end exit 1 end def _hook_check_undefined_keys(**options) _log(**_options, name: _fullname, **options, severity: Logger::DEBUG) undefined_keys = _raw.keys - self.class._names return if undefined_keys.empty? _log(**_options, name: _fullname, severity: Logger::WARN, **options) do "has undefined keys: #{undefined_keys.inspect}" end end end end