Sha256: 78dbc4c57d0c693aa1e8d659eda2aafe8a6b145a5e2b1d0ca2688dc909ccf331

Contents?: true

Size: 891 Bytes

Versions: 3

Compression:

Stored size: 891 Bytes

Contents

module Extract
  class HashBuilder < Base
    INTERNAL_FIELDS = %i[array_of keep_if within].freeze

    def value(index = 0)
      path, props = node.to_h.values_at(:path, :props)

      hash = {}
      props.each do |field_name, nested_props|
        next unless valuable_field? field_name, nested_props, index

        value = ValueBuilder.new(Node.new(nested_props, path), extractor).value
        hash[field_name.to_sym] = value if value.present?
      end

      keep_hash?(hash, props) ? hash : nil
    end

    private

    def keep_hash?(hash, props)
      expression = props[:keep_if]
      expression.present? ? Expression.new(expression, hash).evaluate : true
    end

    def valuable_field?(field_name, props, index)
      return false if INTERNAL_FIELDS.include? field_name
      return false if index.positive? && Node.new(props, "").first_only?

      true
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
xml_data_extractor-0.3.0 lib/src/extract/hash_builder.rb
xml_data_extractor-0.2.0 lib/src/extract/hash_builder.rb
xml_data_extractor-0.1.0 lib/src/extract/hash_builder.rb