module FastlaneCore # Abstract super class class Interface ##################################################### # @!group Messaging: show text to the user ##################################################### # Level Error: Can be used to show additional error # information before actually raising an exception # or can be used to just show an error from which # fastlane can recover (much magic) # # By default those messages are shown in red def error(_message) not_implemented(__method__) end # Level Important: Can be used to show warnings to the user # not necessarly negative, but something the user should # be aware of. # # By default those messages are shown in yellow def important(_message) not_implemented(__method__) end # Level Success: Show that something was successful # # By default those messages are shown in green def success(_message) not_implemented(__method__) end # Level Message: Show a neutral message to the user # # By default those messages shown in white/black def message(_message) not_implemented(__method__) end # Level Deprecated: Show that a particular function is deprecated # # By default those messages shown in strong blue def deprecated(_message) not_implemented(__method__) end # Level Command: Print out a terminal command that is being # executed. # # By default those messages shown in cyan def command(_message) not_implemented(__method__) end # Level Command Output: Print the output of a command with # this method # # By default those messages shown in magenta def command_output(_message) not_implemented(__method__) end # Level Verbose: Print out additional information for the # users that are interested. Will only be printed when # $verbose = true # # By default those messages are shown in white def verbose(_message) not_implemented(__method__) end # Print a header = a text in a box # use this if this message is really important def header(_message) not_implemented(__method__) end ##################################################### # @!group Errors: Inputs ##################################################### # Is is possible to ask the user questions? def interactive?(_message) not_implemented(__method__) end # get a standard text input (single line) def input(_message) not_implemented(__method__) end # A simple yes or no question def confirm(_message) not_implemented(__method__) end # Let the user select one out of x items # return value is the value of the option the user chose def select(_message, _options) not_implemented(__method__) end # Password input for the user, text field shouldn't show # plain text def password(_message) not_implemented(__method__) end ##################################################### # @!group Errors: Different kinds of exceptions ##################################################### # raised from crash! class FastlaneCrash < StandardError end # raised from user_error! class FastlaneError < StandardError attr_reader :show_github_issues def initialize(show_github_issues: true) @show_github_issues = show_github_issues end end # Pass an exception to this method to exit the program # using the given exception # Use this method instead of user_error! if this error is # unexpected, e.g. an invalid server response that shouldn't happen def crash!(exception) raise FastlaneCrash.new, exception.to_s end # Use this method to exit the program because of an user error # e.g. app doesn't exist on the given Developer Account # or invalid user credentials # or scan tests fail # This will show the error message, but doesn't show the full # stack trace # Basically this should be used when you actively catch the error # and want to show a nice error message to the user def user_error!(error_message, options = {}) options = { show_github_issues: false }.merge(options) raise FastlaneError.new(show_github_issues: options[:show_github_issues]), error_message.to_s end ##################################################### # @!group Helpers ##################################################### def not_implemented(method_name) UI.user_error!("Current UI '#{self}' doesn't support method '#{method_name}'") end def to_s self.class.name.split('::').last end end end