Class: ProblemDetail::Document

Inherits:
Object
  • Object
show all
Defined in:
lib/problem_detail.rb

Overview

This document defines a “problem detail” as a way to carry machine-readable details of errors in a HTTP response, to avoid the need to define new error response formats for HTTP APIs.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(title:, type: 'about:blank', **options) ⇒ Document

A problem details object can have some members.

Parameters:

  • title (#to_s)

    A short, human-readable summary of the problem type. It SHOULD NOT change from occurrence to occurrence of the problem, except for purposes of localisation (e.g., using proactive content negotiation).

  • type (#to_s, nil) (defaults to: 'about:blank')

    A URI reference that identifies the problem type. When dereferenced, it is encouraged to provide human-readable documentation for the problem type (e.g., using HTML. When this member is not present, its value is assumed to be “about:blank”.

  • options (Hash)

    Extend the problem details with additional members such as:

    • status: the HTTP status code generated by the origin server for this occurrence of the problem;

    • detail: an human readable explanation specific to this occurrence of the problem;

    • instance: a URI reference that identifies the specific occurrence of the problem.



28
29
30
31
32
# File 'lib/problem_detail.rb', line 28

def initialize(title:, type: 'about:blank', **options)
  @title    = title.to_s
  @type     = URI(type.to_s)
  @options  = options
end

Instance Attribute Details

#titleString (readonly)

Returns A short, human-readable summary of the problem type.

Returns:

  • (String)

    A short, human-readable summary of the problem type.



37
38
39
# File 'lib/problem_detail.rb', line 37

def title
  @title
end

#typeURI (readonly)

Returns A URI reference that identifies the problem type.

Returns:

  • (URI)

    A URI reference that identifies the problem type.



42
43
44
# File 'lib/problem_detail.rb', line 42

def type
  @type
end

Instance Method Details

#detailString?

Returns An human readable explanation.

Returns:

  • (String, nil)

    An human readable explanation.



50
51
52
# File 'lib/problem_detail.rb', line 50

def detail
  @options[:detail].to_s unless @options[:detail].nil?
end

#instanceURI?

Returns The specific occurrence of the problem.

Returns:

  • (URI, nil)

    The specific occurrence of the problem.



55
56
57
# File 'lib/problem_detail.rb', line 55

def instance
  URI(@options[:instance].to_s) unless @options[:instance].nil?
end

#optionsHash

Returns Additional members.

Returns:

  • (Hash)

    Additional members.



60
61
62
# File 'lib/problem_detail.rb', line 60

def options
  @options.reject { |k, _v| %i(status detail instance).include?(k) }
end

#statusFixnum?

Returns The HTTP status code generated by the origin server.

Returns:

  • (Fixnum, nil)

    The HTTP status code generated by the origin server.



45
46
47
# File 'lib/problem_detail.rb', line 45

def status
  @options[:status].to_i unless @options[:status].nil?
end

#to_hHash

Properties of the result.

Returns:

  • (Hash)

    The properties of the result.



67
68
69
70
71
72
73
74
75
76
# File 'lib/problem_detail.rb', line 67

def to_h
  options.merge({
    status:   status,
    detail:   detail,
    instance: instance
  }.reject { |_k, v| v.nil? }).merge(
    title: title,
    type:  type
  )
end