darthjee/danica

View on GitHub
lib/danica/wrapper.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# frozen_string_literal: true

module Danica
  module Wrapper
    autoload :Number,    'danica/wrapper/number'
    autoload :Group,     'danica/wrapper/group'
    autoload :Negative,  'danica/wrapper/negative'
    autoload :PlusMinus, 'danica/wrapper/plus_minus'
    autoload :Constant,  'danica/wrapper/constant'
    autoload :Variable,  'danica/wrapper/variable'
    autoload :Container, 'danica/wrapper/container'

    def wrap_value(value)
      Wrapper.wrap_value(value)
    end

    def self.wrap_value(value)
      case value
      when Formatted
        value.content
      when Numeric
        wrap_numeric(value)
      when Hash
        wrap_hash(value)
      when String, Symbol, NilClass
        Variable.new(name: value)
      else
        raise Exception::InvalidInput, value unless value.is_a?(Danica::Common)

        value
      end
    end

    def self.wrap_numeric(number)
      return Negative.new(Number.new(-number)) if number < 0

      Number.new(number)
    end

    def self.wrap_hash(hash)
      return Constant.new(hash) if hash.keys.map(&:to_sym).sort == %i[gnuplot latex value]

      Variable.new(hash)
    end
  end
end