require 'fluent/config/types' module Fluent class OjOptions OPTIONS = { 'bigdecimal_load': :symbol, 'mode': :symbol, 'use_to_json': :bool } ALLOWED_VALUES = { 'bigdecimal_load': %i[bigdecimal float auto], 'mode': %i[strict null compat json rails custom] } DEFAULTS = { 'bigdecimal_load': :float, 'mode': :compat, 'use_to_json': true } @@available = false def self.available? @@available end def self.load_env options = self.get_options begin require 'oj' Oj.default_options = options @@available = true rescue LoadError @@available = false end options end private def self.get_options options = {} DEFAULTS.each { |key, value| options[key] = value } OPTIONS.each do |key, type| env_value = ENV["FLUENT_OJ_OPTION_#{key.upcase}"] next if env_value.nil? cast_value = Fluent::Config.reformatted_value(OPTIONS[key], env_value, { strict: true }) next if cast_value.nil? next if ALLOWED_VALUES[key] && !ALLOWED_VALUES[key].include?(cast_value) options[key.to_sym] = cast_value end options end end end