class PhcStringFormat::PhcString

Parser for parsing PHC-string-format.

Public Class Methods

create(id:, version: nil, params: nil, salt: nil, hash: nil, hint: {}) click to toggle source
# File lib/phc_string_format/phc_string.rb, line 28
def self.create(id:, version: nil, params: nil, salt: nil, hash: nil, hint: {})
  PhcString.new \
    id,
    (Parameters.to_s(v: version) if version),
    (Parameters.to_s(params) if params),
    hint.dig(:salt, :encoding) == '7bit' ? salt : B64.encode(salt),
    B64.encode(hash)
end
new(id, version_string, params_string, encoded_salt, encoded_hash) click to toggle source
# File lib/phc_string_format/phc_string.rb, line 58
def initialize(id, version_string, params_string, encoded_salt, encoded_hash)
  @id = id
  @version_string = version_string
  @params_string = params_string
  @encoded_salt = encoded_salt
  @encoded_hash = encoded_hash

  self.class.do_validate self
end
parse(string) click to toggle source
# File lib/phc_string_format/phc_string.rb, line 8
def self.parse(string)
  string ||= ''
  PhcString.new(*split(string))
rescue StandardError => exception
  raise ParseError, exception.message
end

Private Class Methods

split(string) click to toggle source

:reek: DuplicateMethodCall { allow_calls: ['elements.shift', 'elements.first'] }

# File lib/phc_string_format/phc_string.rb, line 16
def self.split(string)
  elements = string.split(/\$/, 6)
  elements.shift
  [
    elements.shift,
    (elements.shift if (elements.first || '').start_with?('v=')),
    (elements.shift if (elements.first || '').include?('=')),
    elements.shift,
    elements.shift
  ]
end

Public Instance Methods

==(other) click to toggle source
# File lib/phc_string_format/phc_string.rb, line 92
def ==(other)
  instance_variable_values = other.instance_variables.map { |name| other.instance_variable_get(name) }
  instance_variable_values == instance_variables.map { |name| instance_variable_get(name) }
end
to_h(pick: nil, hint: {}) click to toggle source
# File lib/phc_string_format/phc_string.rb, line 78
def to_h(pick: nil, hint: {})
  pick ||= %i[id version params salt hash]
  {
    id: (@id if pick.include?(:id)),
    version: (Parameters.to_h(@version_string)['v'] if pick.include?(:version)),
    params: (Parameters.to_h(@params_string) if pick.include?(:params)),
    salt:
      if pick.include?(:salt)
        hint.dig(:salt, :encoding) == '7bit' ? @encoded_salt : B64.decode(@encoded_salt)
      end,
    hash: (B64.decode(@encoded_hash) if pick.include?(:hash))
  }.select { |_, value| value }
end
to_s() click to toggle source
# File lib/phc_string_format/phc_string.rb, line 68
def to_s
  '$' + [
    @id,
    @version_string,
    @params_string,
    @encoded_salt,
    @encoded_hash
  ].compact.join('$')
end

Private Instance Methods

validate_params_string() click to toggle source
# File lib/phc_string_format/phc_string.rb, line 99
def validate_params_string
  !@params_string || !@params_string.empty? && @params_string.split(',').all? \
    { |param| param =~ %r{\A[a-z0-9-]{1,32}=[a-zA-Z0-9/+.-]+\z} }
end
validate_salt_and_hash() click to toggle source
# File lib/phc_string_format/phc_string.rb, line 104
def validate_salt_and_hash
  @encoded_salt || !@encoded_hash
end