Class: EventEngine::DslCompiler

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

Defined Under Namespace

Classes: InvalidEventNameError

Constant Summary collapse

SNAKE_CASE =
/\A[a-z][a-z0-9_]*\z/

Class Method Summary collapse

Class Method Details

.compile(definitions) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/event_engine/dsl_compiler.rb', line 7

def self.compile(definitions)
  registry = SchemaRegistry.new
  subject_violations = []
  name_violations = []

  Array(definitions).each do |definition|
    schema = definition.schema
    record_subject_violation(schema, subject_violations)
    record_name_violation(schema, name_violations)
    registry.register(schema)
  end

  raise_invalid_event_names(name_violations)
  raise_unknown_subjects(subject_violations)

  registry
end

.raise_invalid_event_names(violations) ⇒ Object



31
32
33
34
35
# File 'lib/event_engine/dsl_compiler.rb', line 31

def self.raise_invalid_event_names(violations)
  return if violations.empty?

  raise InvalidEventNameError, "event names must be snake_case: #{violations.join(", ")}"
end

.raise_unknown_subjects(violations) ⇒ Object



44
45
46
47
48
# File 'lib/event_engine/dsl_compiler.rb', line 44

def self.raise_unknown_subjects(violations)
  return if violations.empty?

  raise SubjectRegistry::UnknownSubjectError, violations.join(", ")
end

.record_name_violation(schema, violations) ⇒ Object



25
26
27
28
29
# File 'lib/event_engine/dsl_compiler.rb', line 25

def self.record_name_violation(schema, violations)
  return if schema.event_name.to_s.match?(SNAKE_CASE)

  violations << schema.event_name.inspect
end

.record_subject_violation(schema, violations) ⇒ Object



37
38
39
40
41
42
# File 'lib/event_engine/dsl_compiler.rb', line 37

def self.record_subject_violation(schema, violations)
  return if schema.subject.nil?
  return if EventEngine.subject_registry.registered?(schema.subject)

  violations << "#{schema.event_name}: unknown subject #{schema.subject.inspect}"
end