1# frozen_string_literal: true
2
3module Gitlab
4  module I18n
5    class MetadataEntry
6      attr_reader :entry_data
7
8      # Avoid testing too many plurals if `nplurals` was incorrectly set.
9      # Based on info on https://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html
10      # which mentions special cases for numbers ending in 2 digits
11      MAX_FORMS_TO_TEST = 101
12
13      def initialize(entry_data)
14        @entry_data = entry_data
15      end
16
17      def expected_forms
18        return unless plural_information
19
20        plural_information['nplurals'].to_i
21      end
22
23      def forms_to_test
24        @forms_to_test ||= [expected_forms, MAX_FORMS_TO_TEST].compact.min
25      end
26
27      private
28
29      def plural_information
30        return @plural_information if defined?(@plural_information)
31
32        if plural_line = entry_data[:msgstr].detect { |metadata_line| metadata_line.starts_with?('Plural-Forms: ') }
33          @plural_information = Hash[plural_line.scan(/(\w+)=([^;\n]+)/)]
34        end
35      end
36    end
37  end
38end
39