Sha256: f8c14fc0f77dd8d29393b6f5d21eefe3cd51adca3074f4512480985c53663e7c

Contents?: true

Size: 1.2 KB

Versions: 1

Compression:

Stored size: 1.2 KB

Contents

module Refcode

  module Encodable

    def self.included base
      base.extend ClassMethods
    end

    def generate_refcode val
      check_refcode_options!
      encoder.encode val
    end

    def parse_refcode code
      check_refcode_options!
      encoder.decode code
    end

    module ClassMethods
      def has_refcode options
        raise ArgumentError unless options[:secret] && options[:salt]
        @refcode_options = options
      end
      def refcode_options
        @refcode_options
      end
    end

    private

    def encoder
      Refcode::Encoder.new do |r|
        check_refcode_options!
        r.secret = self.class.refcode_options[:secret]
        salt_option = self.class.refcode_options[:salt]
        if salt_option.respond_to? :call
          r.salt = salt_option.call self
        elsif salt_option.is_a? Symbol
          r.salt = self.send salt_option
        else
          r.salt = salt_option
        end
        raise "Value for salt is nil (#{salt_option} given)" if r.salt.nil?
      end
    end

    def check_refcode_options!
      raise RefcodeInitException.new('You must call the has_refcode method in your class definition') unless self.class.refcode_options
    end

  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
refcode-0.1.1 lib/refcode/encodable.rb