Class: ConvertSdk::Sentinel

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

Overview

A frozen singleton sentinel — the SDK's public contract for a business miss.

Bucketing and feature decisions that find no answer (no data, not enough data, no variation decided) return a Sentinel singleton rather than raising or returning a bare nil. This is architecture Decision 2: misses are signaled by value, never by exception.

The protocol a Sentinel implements:

  • #to_s — the byte-identical JS wire string (appears in payloads/logs).
  • #key — always nil, so the documented integrator pattern case variation&.key falls through to the else branch on a miss.
  • #error? — always true, the value-object discriminator that distinguishes a sentinel from a real BucketedVariation/BucketedFeature (both false).

Sentinels are exposed as frozen singleton constants (e.g. RuleError::NO_DATA_FOUND), so callers can branch on object identity for granular handling:

result = context.run_experience("homepage-test")
case result.key
when nil
# a miss — inspect which one via identity
show_default if result.equal?(ConvertSdk::RuleError::NO_DATA_FOUND)
else
render_variation(result.key)
end

Equality is intentionally left as default object identity (no == override): two distinct Sentinel instances built from the same wire string are NOT equal, which is why the canonical instances live as shared frozen constants.

Instance Method Summary collapse

Constructor Details

#initialize(wire_string) ⇒ Sentinel

Returns a new instance of Sentinel.

Parameters:

  • wire_string (String)

    the JS-parity wire string this sentinel emits.



37
38
39
40
# File 'lib/convert_sdk/sentinel.rb', line 37

def initialize(wire_string)
  @wire_string = wire_string.dup.freeze
  freeze
end

Instance Method Details

#error?Boolean

Returns always true — a sentinel always signals a business miss.

Returns:

  • (Boolean)

    always true — a sentinel always signals a business miss.



53
54
55
# File 'lib/convert_sdk/sentinel.rb', line 53

def error?
  true
end

#keynil

Returns always nil, so case variation&.key falls through to else.

Returns:

  • (nil)

    always nil, so case variation&.key falls through to else.



48
49
50
# File 'lib/convert_sdk/sentinel.rb', line 48

def key
  nil
end

#to_sString

Returns the byte-identical JS wire string.

Returns:

  • (String)

    the byte-identical JS wire string.



43
44
45
# File 'lib/convert_sdk/sentinel.rb', line 43

def to_s
  @wire_string
end