Sha256: 5f99c0722aaa1544140cafc9b5520cc8ba5dcd77552f033e2b09e06d3c313fb5

Contents?: true

Size: 978 Bytes

Versions: 5

Compression:

Stored size: 978 Bytes

Contents

# require 'troles/common/marshaller/generic'

module Troles::Common
  module Marshaller
    class Bitmask < Generic
      attr_reader :role_subject, :valid_roles

      def initialize role_subject
        super
      end

      def read
        valid_roles.reject do |r| 
          num = as_number(ds_field_value) 
          ((num || 0) & calc_index(r)).zero?
        end
      end

      def write *roles
        roles = roles.uniq.compact
        return as_number(false) if roles.empty?
        roles.to_symbols.map { |r| calc_index(r) }.inject { |sum, bitvalue| sum + bitvalue }          
      end
      
      protected

      def as_number value
        case value
        when TrueClass, FalseClass
          value ? 2 : 1
        when Fixnum
          value 
        else
          raise ArgumentError, "Cant be converted to a bit index, #{value}"
        end
      end
        
      def calc_index(r)
        2**valid_roles.index(r)
      end        
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
troles-0.6.1 lib/troles/common/marshaller/bitmask.rb
troles-0.6.0 lib/troles/common/marshaller/bitmask.rb
troles-0.5.2 lib/troles/common/marshaller/bitmask.rb
troles-0.5.1 lib/troles/common/marshaller/bitmask.rb
troles-0.5.0 lib/troles/common/marshaller/bitmask.rb