class DataTypes::BaseType
Attributes
bit_length[RW]
count[RW]
endianess[RW]
length[RW]
name[RW]
parent[RW]
raw_value[RW]
sign[RW]
type[RW]
value[RW]
Public Class Methods
new(options = {})
click to toggle source
# File lib/active_model_serializers_binary/base_type.rb, line 7 def initialize(options = {}) @default_value = options[:default_value].nil? ? 0 : options[:default_value] @raw_value = nil @bit_length = options[:bit_length] # Cantidad de bits del tipo de dato @type = type @sign = options[:sign] # :signed / :unsigned @count = options[:count] || 1 # Cantidad de elementos del array @length = options[:length] || 1 # En char y bitfield especifica la longitud del campo. Ignorado para el resto de los tipos @value = check_value( @default_value ) @block = options[:block] @name = options[:name] @parent = options[:parent] @endianess = options[:endianess] || :little end
Public Instance Methods
after_load()
click to toggle source
Se ejecuta después de deserializar los datos. @value contiene los datos deserializados
@return [Array] Array con los datos deserializados
# File lib/active_model_serializers_binary/base_type.rb, line 131 def after_load if !@block.nil? @parent.instance_exec( self, :load, &@block ) end @value end
before_dump(value)
click to toggle source
Se ejecuta antes de serializar los datos
@param [Object] value valor del objeto a serializar original
@return [Array] nuevo valor del objeto a serializar
# File lib/active_model_serializers_binary/base_type.rb, line 117 def before_dump(value) self.value = value if !value.nil? if !@block.nil? value = @parent.instance_exec( self, :dump, &@block ) end self.value = value if !value.nil? end
check( value, options = {} )
click to toggle source
# File lib/active_model_serializers_binary/base_type.rb, line 35 def check( value, options = {} ) type = options[:type] count = options[:count] length = options[:length] bit_length = options[:bit_length] sign = options[:sign] default_value = options[:default_value] value = Array(value) # Se asegura de que sea un array value = value[0...count] # Corta el array según la cantidad de elementos especificados en la declaración # Lo convierte al tipo especificado value.map! do |v| if v.nil? default_value else case type when :float32, :float64 v.to_f when :char v.to_s[0...length] when :bool (v.in? [1, true]) ? true : false when :nest v else v.to_i end end end trim(value, bit_length, sign) # Se asegura de que los valores esten dentro de los rangos permitidos pra el tipo de dato declarado value.fill(default_value, value.length...count) # Completa los elementos faltantes del array con default_value end
check_raw_value(value)
click to toggle source
Los datos siempre vienen en bytes
# File lib/active_model_serializers_binary/base_type.rb, line 81 def check_raw_value(value) check(value, { :type => :uint8, :count => (size < 1 ? 1 : size), :length => 1, :bit_length => 8, :sign => :unsigned, :default_value => 0, }) end
check_value(value)
click to toggle source
# File lib/active_model_serializers_binary/base_type.rb, line 69 def check_value(value) check(value, { :type => @type, :count => @count, :length => @length, :bit_length => @bit_length, :sign => @sign, :default_value => @default_value, }) end
size()
click to toggle source
Return size of object in bytes
# File lib/active_model_serializers_binary/base_type.rb, line 31 def size (@bit_length*@length*@count)/8.0 end
to_s()
click to toggle source
# File lib/active_model_serializers_binary/base_type.rb, line 22 def to_s @value.to_s end
trim(value, bit_length, sign)
click to toggle source
# File lib/active_model_serializers_binary/base_type.rb, line 92 def trim(value, bit_length, sign) # Recorta los valores según el bit_length value.map! do |v| if sign == :signed [-2**(bit_length-1),[v.to_i,2**(bit_length-1)-1].min].max elsif sign == :unsigned [0,[v.to_i,2**(bit_length)-1].min].max else v end end end
value=(value)
click to toggle source
# File lib/active_model_serializers_binary/base_type.rb, line 105 def value=(value) @value = check_value(value) end