Class: YggdrasilEngine

Inherits:
Object
  • Object
show all
Extended by:
FFI::Library
Defined in:
lib/yggdrasil_engine.rb

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeYggdrasilEngine

Returns a new instance of YggdrasilEngine.



79
80
81
82
83
# File 'lib/yggdrasil_engine.rb', line 79

def initialize
  @engine = YggdrasilEngine.new_engine
  @custom_strategy_handler = CustomStrategyHandler.new
  ObjectSpace.define_finalizer(self, self.class.finalize(@engine))
end

Class Attribute Details

.loggerObject

Returns the value of attribute logger.



74
75
76
# File 'lib/yggdrasil_engine.rb', line 74

def logger
  @logger
end

Class Method Details

.finalize(engine) ⇒ Object



85
86
87
# File 'lib/yggdrasil_engine.rb', line 85

def self.finalize(engine)
  proc { YggdrasilEngine.free_engine(engine) }
end

Instance Method Details

#count_toggle(toggle_name, enabled) ⇒ Object



143
144
145
146
# File 'lib/yggdrasil_engine.rb', line 143

def count_toggle(toggle_name, enabled)
  response_ptr = YggdrasilEngine.count_toggle(@engine, toggle_name, enabled)
  YggdrasilEngine.free_response(response_ptr)
end

#count_variant(toggle_name, variant_name) ⇒ Object



148
149
150
151
# File 'lib/yggdrasil_engine.rb', line 148

def count_variant(toggle_name, variant_name)
  response_ptr = YggdrasilEngine.count_variant(@engine, toggle_name, variant_name)
  YggdrasilEngine.free_response(response_ptr)
end

#enabled?(toggle_name, context) ⇒ Boolean

Returns:

  • (Boolean)


128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/yggdrasil_engine.rb', line 128

def enabled?(toggle_name, context)
  context_json = (context || {}).to_json
  custom_strategy_results = @custom_strategy_handler.evaluate_custom_strategies(toggle_name, context).to_json

  response_ptr = YggdrasilEngine.check_enabled(@engine, toggle_name, context_json, custom_strategy_results)
  response_json = response_ptr.read_string
  YggdrasilEngine.free_response(response_ptr)
  response = JSON.parse(response_json, symbolize_names: true)

  raise "Error: #{response[:error_message]}" if response[:status_code] == ERROR_RESPONSE
  return nil if response[:status_code] == TOGGLE_MISSING_RESPONSE

  return response[:value] == true
end

#get_metricsObject



153
154
155
156
157
158
# File 'lib/yggdrasil_engine.rb', line 153

def get_metrics
  metrics_ptr = YggdrasilEngine.get_metrics(@engine)
  metrics = JSON.parse(metrics_ptr.read_string, symbolize_names: true)
  YggdrasilEngine.free_response(metrics_ptr)
  metrics[:value]
end

#get_stateObject



99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/yggdrasil_engine.rb', line 99

def get_state
   response_ptr = YggdrasilEngine.get_state(@engine)
   begin
     response_json = response_ptr.read_string
     response = JSON.parse(response_json, symbolize_names: true)

     raise "Error: #{response[:error_message]}" if response[:status_code] == ERROR_RESPONSE

     response[:value].to_json
   ensure
     YggdrasilEngine.free_response(response_ptr)
   end
end

#get_variant(name, context) ⇒ Object



113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/yggdrasil_engine.rb', line 113

def get_variant(name, context)
  context_json = (context || {}).to_json
  custom_strategy_results = @custom_strategy_handler.evaluate_custom_strategies(name, context).to_json

  variant_def_json_ptr = YggdrasilEngine.check_variant(@engine, name, context_json, custom_strategy_results)
  variant_def_json = variant_def_json_ptr.read_string
  YggdrasilEngine.free_response(variant_def_json_ptr)
  variant_response = JSON.parse(variant_def_json, symbolize_names: true)

  return nil if variant_response[:status_code] == TOGGLE_MISSING_RESPONSE
  variant = variant_response[:value]

  return to_variant(variant) if variant_response[:status_code] == OK_RESPONSE
end

#list_known_togglesObject



160
161
162
163
164
165
# File 'lib/yggdrasil_engine.rb', line 160

def list_known_toggles
  response_ptr = YggdrasilEngine.list_known_toggles(@engine)
  response_json = response_ptr.read_string
  YggdrasilEngine.free_response(response_ptr)
  JSON.parse(response_json, symbolize_names: true)
end

#register_custom_strategies(strategies) ⇒ Object



167
168
169
# File 'lib/yggdrasil_engine.rb', line 167

def register_custom_strategies(strategies)
  @custom_strategy_handler.register_custom_strategies(strategies)
end

#take_state(toggles) ⇒ Object



89
90
91
92
93
94
95
96
97
# File 'lib/yggdrasil_engine.rb', line 89

def take_state(toggles)
  @custom_strategy_handler.update_strategies(toggles)
  response_ptr = YggdrasilEngine.take_state(@engine, toggles)
  take_toggles_response = JSON.parse(response_ptr.read_string, symbolize_names: true)
  if take_toggles_response[:status_code] == ERROR_RESPONSE
    self.class.logger.error("Error taking state, flags were not updated: #{take_toggles_response[:error_message]}")
  end
  YggdrasilEngine.free_response(response_ptr)
end