@@ -10,7 +10,8 @@ module Contract # rubocop:disable Metrics/ModuleLength
1010 CODES = {
1111 unauthorized : Html2rss ::Web ::UnauthorizedError ::CODE ,
1212 forbidden : Html2rss ::Web ::ForbiddenError ::CODE ,
13- internal_server_error : Html2rss ::Web ::InternalServerError ::CODE
13+ internal_server_error : Html2rss ::Web ::InternalServerError ::CODE ,
14+ extraction_empty : 'EXTRACTION_EMPTY'
1415 } . freeze
1516
1617 ERROR_KINDS = {
@@ -50,7 +51,10 @@ module Contract # rubocop:disable Metrics/ModuleLength
5051
5152 MESSAGES = {
5253 auto_source_disabled : 'Auto source feature is disabled' ,
53- health_check_failed : 'Health check failed'
54+ health_check_failed : 'Health check failed' ,
55+ extraction_empty :
56+ 'We could not extract feed items from this page yet. ' \
57+ 'Try a more specific listing URL or explicit selectors.'
5458 } . freeze
5559
5660 class << self
@@ -92,14 +96,26 @@ def warning(code:, message:, retryable:, next_action:)
9296 # @param error [StandardError]
9397 # @return [Hash{Symbol=>Object}]
9498 def failure_metadata ( error )
95- case error
96- when Html2rss ::Web ::AutoSourceDisabledError , Html2rss ::Web ::HealthCheckFailedError
97- non_retryable_server_failure_metadata
98- when Html2rss ::Web ::UnauthorizedError then auth_failure_metadata
99- when Html2rss ::Web ::BadRequestError , Html2rss ::Web ::ForbiddenError then input_failure_metadata
100- else
101- generic_failure_metadata ( error )
102- end
99+ return input_failure_metadata if input_failure? ( error )
100+ return non_retryable_server_failure_metadata if non_retryable_server_failure? ( error )
101+ return auth_failure_metadata if error . is_a? ( Html2rss ::Web ::UnauthorizedError )
102+
103+ generic_failure_metadata ( error )
104+ end
105+
106+ # @param error [StandardError]
107+ # @return [Boolean]
108+ def input_failure? ( error )
109+ Html2rss ::Web ::ErrorClassification . auto_fallback_exhausted? ( error ) ||
110+ error . is_a? ( Html2rss ::Web ::BadRequestError ) ||
111+ error . is_a? ( Html2rss ::Web ::ForbiddenError )
112+ end
113+
114+ # @param error [StandardError]
115+ # @return [Boolean]
116+ def non_retryable_server_failure? ( error )
117+ error . is_a? ( Html2rss ::Web ::AutoSourceDisabledError ) ||
118+ error . is_a? ( Html2rss ::Web ::HealthCheckFailedError )
103119 end
104120
105121 # @param error [StandardError]
@@ -147,14 +163,24 @@ def non_retryable_server_failure_metadata
147163 # @param error [StandardError]
148164 # @return [String]
149165 def client_message_for ( error )
166+ return MESSAGES [ :extraction_empty ] if extraction_empty_failure? ( error )
167+
150168 error . is_a? ( Html2rss ::Web ::HttpError ) ? error . message : Html2rss ::Web ::HttpError ::DEFAULT_MESSAGE
151169 end
152170
153171 # @param error [StandardError]
154172 # @return [String]
155173 def error_code_for ( error )
174+ return CODES [ :extraction_empty ] if extraction_empty_failure? ( error )
175+
156176 error . respond_to? ( :code ) ? error . code : CODES [ :internal_server_error ]
157177 end
178+
179+ # @param error [StandardError]
180+ # @return [Boolean]
181+ def extraction_empty_failure? ( error )
182+ Html2rss ::Web ::ErrorClassification . auto_fallback_exhausted? ( error )
183+ end
158184 end
159185 end
160186 end
0 commit comments