Sha256: bdc552b01251acfb3273cccad9fcaf900fa050e232c1aee9c0b19d6e83a28c4f

Contents?: true

Size: 1.99 KB

Versions: 79

Compression:

Stored size: 1.99 KB

Contents

# frozen_string_literal: true

require_dependency "renalware/pathology"

module Renalware
  module Pathology
    # We mix this module into any database-returned jsonb hash of observations
    # (e.g. CurrentObservationSet.values and Letter.pathology_snapshot)
    module ObservationSetMethods
      VALID_SUFFIXES = %w(_result _observed_at).freeze

      # Support these syntaxes
      #   values.hgb # => { result: ... observed_at: ...}
      #   values.HGB # => { result: ... observed_at: ...}
      #   values.hgb_result # => 3.3
      #   values.hgb_observed_at # => "2017-17-01"
      # So the values has methods corresponding to the entire set of possible
      # OBX codes, and also methods to reach in and get their result and observed_at date.
      def method_missing(method_name, *_args, &_block)
        code, suffix = method_parts(method_name)
        if VALID_SUFFIXES.include?(suffix) || AllObservationCodes.include?(code)
          observation_hash_or_hash_element_for(code, suffix)
        else
          super
        end
      end

      # From eg hgb_result, returns
      # [:HGB, "result"]
      def method_parts(method_name)
        matches = method_name.to_s.match(/([^_]*)(\w*)/)
        [matches[1]&.upcase&.to_sym, matches[2]]
      end

      def observation_hash_or_hash_element_for(code, suffix)
        obs_hash = self[code]
        return nil if obs_hash.nil? # the patient may not have this observation in the set
        return obs_hash[:result] if suffix == "_result"
        return Date.parse(obs_hash[:observed_at]) if suffix == "_observed_at"

        obs_hash
      end
    end

    class ObservationsJsonbSerializer
      def self.dump(hash)
        JSON.parse hash.to_json
      end

      def self.load(hash)
        type_check(hash)
          .with_indifferent_access
          .extend(ObservationSetMethods)
      end

      def self.type_check(hash)
        if hash.nil? then {}
        elsif hash.is_a?(Hash) then hash
        else JSON.parse(hash)
        end
      end
    end
  end
end

Version data entries

79 entries across 79 versions & 1 rubygems

Version Path
renalware-core-2.0.110 app/models/renalware/pathology/observations_jsonb_serializer.rb
renalware-core-2.0.109 app/models/renalware/pathology/observations_jsonb_serializer.rb
renalware-core-2.0.108 app/models/renalware/pathology/observations_jsonb_serializer.rb
renalware-core-2.0.106 app/models/renalware/pathology/observations_jsonb_serializer.rb
renalware-core-2.0.105 app/models/renalware/pathology/observations_jsonb_serializer.rb
renalware-core-2.0.104 app/models/renalware/pathology/observations_jsonb_serializer.rb
renalware-core-2.0.103 app/models/renalware/pathology/observations_jsonb_serializer.rb
renalware-core-2.0.102 app/models/renalware/pathology/observations_jsonb_serializer.rb
renalware-core-2.0.101 app/models/renalware/pathology/observations_jsonb_serializer.rb
renalware-core-2.0.100 app/models/renalware/pathology/observations_jsonb_serializer.rb
renalware-core-2.0.99 app/models/renalware/pathology/observations_jsonb_serializer.rb
renalware-core-2.0.98 app/models/renalware/pathology/observations_jsonb_serializer.rb
renalware-core-2.0.97 app/models/renalware/pathology/observations_jsonb_serializer.rb
renalware-core-2.0.96 app/models/renalware/pathology/observations_jsonb_serializer.rb
renalware-core-2.0.95 app/models/renalware/pathology/observations_jsonb_serializer.rb
renalware-core-2.0.94 app/models/renalware/pathology/observations_jsonb_serializer.rb
renalware-core-2.0.93 app/models/renalware/pathology/observations_jsonb_serializer.rb
renalware-core-2.0.92 app/models/renalware/pathology/observations_jsonb_serializer.rb
renalware-core-2.0.91 app/models/renalware/pathology/observations_jsonb_serializer.rb
renalware-core-2.0.90 app/models/renalware/pathology/observations_jsonb_serializer.rb