Class: EventEngine::EventSchema

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

Defined Under Namespace

Classes: DuplicateEventNameError

Instance Method Summary collapse

Constructor Details

#initializeEventSchema

Returns a new instance of EventSchema.



5
6
7
8
# File 'lib/event_engine/event_schema.rb', line 5

def initialize
  @schemas_by_event = {}
  @finalized = false
end

Instance Method Details

#events(domain: nil) ⇒ Object



29
30
31
32
33
34
# File 'lib/event_engine/event_schema.rb', line 29

def events(domain: nil)
  @schemas_by_event.keys
    .select { |(schema_domain, _name)| domain.nil? || schema_domain == domain }
    .map { |(_domain, event_name)| event_name }
    .uniq
end

#finalize!Object



51
52
53
54
55
56
# File 'lib/event_engine/event_schema.rb', line 51

def finalize!
  @finalized = true
  @schemas_by_event.each_value(&:freeze)
  @schemas_by_event.freeze
  freeze
end

#guard_duplicate_event_name!(existing, incoming) ⇒ Object



20
21
22
23
24
25
26
27
# File 'lib/event_engine/event_schema.rb', line 20

def guard_duplicate_event_name!(existing, incoming)
  return unless existing

  raise DuplicateEventNameError,
        "duplicate (domain, event_name) " \
        "(#{incoming.domain.inspect}, #{incoming.event_name.inspect}): " \
        "already registered at version #{existing.event_version.inspect}"
end

#latest_for(event_name, domain: nil) ⇒ Object



45
46
47
48
49
# File 'lib/event_engine/event_schema.rb', line 45

def latest_for(event_name, domain: nil)
  merged = version_sets_for(event_name, domain).reduce({}, :merge)
  return nil if merged.empty?
  merged[merged.keys.max]
end

#register(schema) ⇒ Object

Raises:

  • (FrozenError)


10
11
12
13
14
15
16
17
18
# File 'lib/event_engine/event_schema.rb', line 10

def register(schema)
  raise FrozenError, "EventSchema is finalized" if @finalized
  key = key_for(schema.domain, schema.event_name)
  version = schema.event_version

  @schemas_by_event[key] ||= {}
  guard_duplicate_event_name!(@schemas_by_event[key][version], schema)
  @schemas_by_event[key][version] = schema
end

#schema_for(event_name, version, domain: nil) ⇒ Object



40
41
42
43
# File 'lib/event_engine/event_schema.rb', line 40

def schema_for(event_name, version, domain: nil)
  set = version_sets_for(event_name, domain).find { |versions| versions.key?(version) }
  set && set[version]
end

#schemas_by_eventObject



58
59
60
# File 'lib/event_engine/event_schema.rb', line 58

def schemas_by_event
  @schemas_by_event
end

#versions_for(event_name, domain: nil) ⇒ Object



36
37
38
# File 'lib/event_engine/event_schema.rb', line 36

def versions_for(event_name, domain: nil)
  version_sets_for(event_name, domain).flat_map(&:keys).uniq.sort
end