58 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
module RemoteDevelopment
 | 
						|
  module Settings
 | 
						|
    class Main
 | 
						|
      include Messages
 | 
						|
      extend MessageSupport
 | 
						|
 | 
						|
      # @param [Hash] context
 | 
						|
      # @return [Hash]
 | 
						|
      # @raise [UnmatchedResultError]
 | 
						|
      def self.get_settings(context)
 | 
						|
        initial_result = Gitlab::Fp::Result.ok(context)
 | 
						|
 | 
						|
        # The order of the chain determines the precedence of settings. I.e., defaults are
 | 
						|
        # overridden by env vars, and any subsequent steps override env vars.
 | 
						|
        result =
 | 
						|
          initial_result
 | 
						|
            .map(SettingsInitializer.method(:init))
 | 
						|
            .and_then(CurrentSettingsReader.method(:read))
 | 
						|
            .map(ExtensionsGalleryMetadataGenerator.method(:generate))
 | 
						|
            # NOTE: EnvVarReader is kept as last step, so it can always be used to easily override any settings for
 | 
						|
            #       local or temporary testing.
 | 
						|
            .and_then(EnvVarReader.method(:read))
 | 
						|
            .and_then(RemoteDevelopment::Settings::ExtensionsGalleryValidator.method(:validate))
 | 
						|
            .and_then(RemoteDevelopment::Settings::ExtensionsGalleryMetadataValidator.method(:validate))
 | 
						|
            .and_then(RemoteDevelopment::Settings::ReconciliationIntervalSecondsValidator.method(:validate))
 | 
						|
            .map(
 | 
						|
              # As the final step, return the settings in a SettingsGetSuccessful message
 | 
						|
              ->(context) do
 | 
						|
                SettingsGetSuccessful.new(settings: context.fetch(:settings))
 | 
						|
              end
 | 
						|
            )
 | 
						|
        # rubocop:disable Lint/DuplicateBranch -- Rubocop doesn't know the branches are different due to destructuring
 | 
						|
        case result
 | 
						|
        in { err: SettingsEnvironmentVariableReadFailed => message }
 | 
						|
          generate_error_response_from_message(message: message, reason: :internal_server_error)
 | 
						|
        in { err: SettingsCurrentSettingsReadFailed => message }
 | 
						|
          generate_error_response_from_message(message: message, reason: :internal_server_error)
 | 
						|
        in { err: SettingsVscodeExtensionsGalleryValidationFailed => message }
 | 
						|
          generate_error_response_from_message(message: message, reason: :internal_server_error)
 | 
						|
        in { err: SettingsVscodeExtensionsGalleryMetadataValidationFailed => message }
 | 
						|
          generate_error_response_from_message(message: message, reason: :internal_server_error)
 | 
						|
        in { err: SettingsFullReconciliationIntervalSecondsValidationFailed => message }
 | 
						|
          generate_error_response_from_message(message: message, reason: :internal_server_error)
 | 
						|
        in { err: SettingsPartialReconciliationIntervalSecondsValidationFailed => message }
 | 
						|
          generate_error_response_from_message(message: message, reason: :internal_server_error)
 | 
						|
        in { ok: SettingsGetSuccessful => message }
 | 
						|
          { settings: message.content.fetch(:settings), status: :success }
 | 
						|
        else
 | 
						|
          raise UnmatchedResultError.new(result: result)
 | 
						|
        end
 | 
						|
        # rubocop:enable Lint/DuplicateBranch
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |