Class: EventEngine::EventSchema

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

Defined Under Namespace

Classes: DuplicateEventNameError

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeEventSchema

Returns a new instance of EventSchema.



11
12
13
14
# File 'lib/event_engine/event_schema.rb', line 11

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

Class Method Details

.define(&block) ⇒ Object



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

def self.define(&block)
  schema = new
  block.call(schema)
  schema
end

Instance Method Details

#events(domain: nil) ⇒ Object



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

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



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

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

#guard_duplicate_event_name!(existing, incoming) ⇒ Object



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

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



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

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)


16
17
18
19
20
21
22
23
24
# File 'lib/event_engine/event_schema.rb', line 16

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



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

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



64
65
66
# File 'lib/event_engine/event_schema.rb', line 64

def schemas_by_event
  @schemas_by_event
end

#versions_for(event_name, domain: nil) ⇒ Object



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

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