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.



30
31
32
33
34
# File 'lib/problem_detail.rb', line 30

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.



39
40
41
# File 'lib/problem_detail.rb', line 39

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.



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

def type
  @type
end

Instance Method Details

#detailString?

Returns An human readable explanation.

Returns:

  • (String, nil)

    An human readable explanation.



52
53
54
# File 'lib/problem_detail.rb', line 52

def detail
  @options[:detail]&.to_s
end

#instanceURI?

Returns The specific occurrence of the problem.

Returns:

  • (URI, nil)

    The specific occurrence of the problem.



57
58
59
# File 'lib/problem_detail.rb', line 57

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

#optionsHash

Returns Additional members.

Returns:

  • (Hash)

    Additional members.



62
63
64
# File 'lib/problem_detail.rb', line 62

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.



47
48
49
# File 'lib/problem_detail.rb', line 47

def status
  @options[:status]&.to_i
end

#to_hHash

Properties of the result.

Returns:

  • (Hash)

    The properties of the result.



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

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