18F/identity-idp

View on GitHub
app/services/x509/attributes.rb

Summary

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

module X509
  Attributes = Struct.new(
    :subject, :issuer, :presented
  ) do
    def self.new_from_hash(hash)
      attrs = new
      hash.slice(*members).each { |key, val| attrs[key] = val }
      attrs
    end

    def self.new_from_json(piv_cert_json)
      return new if piv_cert_json.blank?
      piv_cert_info = JSON.parse(piv_cert_json, symbolize_names: true)
      new_from_hash(piv_cert_info)
    end

    def initialize(*args)
      super
      assign_all_members
    end

    def []=(key, value)
      if value.is_a?(Hash)
        super(key, X509::Attribute.new(**value))
      else
        super(key, X509::Attribute.new(raw: value))
      end
    end

    private

    # rubocop:disable Lint/SelfAssignment
    def assign_all_members
      self.class.members.each do |member|
        self[member] = self[member]
      end
    end
    # rubocop:enable Lint/SelfAssignment
  end
end