Module: RDBr::Metadata::Values

Defined in:
lib/rdbr/metadata/values.rb

Class Method Summary collapse

Class Method Details

.boolean(value, field:) ⇒ Object



46
47
48
49
50
# File 'lib/rdbr/metadata/values.rb', line 46

def boolean(value, field:)
  return value if [ true, false ].include?(value)

  raise InvalidMetadataError, "#{field} must be true or false"
end

.collection(value, member:, field:, allow_empty: true) ⇒ Object



28
29
30
31
32
33
34
35
# File 'lib/rdbr/metadata/values.rb', line 28

def collection(value, member:, field:, allow_empty: true)
  unless value.is_a?(Array) && value.all?{|item| item.is_a?(member) }
    raise InvalidMetadataError, "#{field} must be an Array of #{member}"
  end
  raise InvalidMetadataError, "#{field} must not be empty" if !allow_empty && value.empty?

  value.dup.freeze
end

.deep_copy_freeze(value) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/rdbr/metadata/values.rb', line 52

def deep_copy_freeze(value)
  case value
  when Array
    value.map{|item| deep_copy_freeze(item) }.freeze
  when Hash
    value.to_h{|key, item| [ deep_copy_freeze(key), deep_copy_freeze(item) ] }.freeze
  when String
    value.dup.freeze
  else
    value.freeze
  end
end

.name(value, field:) ⇒ Object



9
10
11
12
13
# File 'lib/rdbr/metadata/values.rb', line 9

def name(value, field:)
  raise InvalidMetadataError, "#{field} must be a non-empty String" unless value.is_a?(String) && !value.empty?

  value.dup.freeze
end

.names(value, field:, allow_empty: false) ⇒ Object



37
38
39
40
41
42
43
44
# File 'lib/rdbr/metadata/values.rb', line 37

def names(value, field:, allow_empty: false)
  unless value.is_a?(Array) && value.all?{|item| item.is_a?(String) && !item.empty? }
    raise InvalidMetadataError, "#{field} must be an Array of non-empty Strings"
  end
  raise InvalidMetadataError, "#{field} must not be empty" if !allow_empty && value.empty?

  value.map{|item| item.dup.freeze }.freeze
end

.optional_name(value, field:) ⇒ Object



15
16
17
18
19
# File 'lib/rdbr/metadata/values.rb', line 15

def optional_name(value, field:)
  return if value.nil?

  name(value, field: field)
end

.optional_string(value, field:) ⇒ Object



21
22
23
24
25
26
# File 'lib/rdbr/metadata/values.rb', line 21

def optional_string(value, field:)
  return if value.nil?
  raise InvalidMetadataError, "#{field} must be a String" unless value.is_a?(String)

  value.dup.freeze
end

.unique_names!(items, field:) ⇒ Object



65
66
67
68
69
70
# File 'lib/rdbr/metadata/values.rb', line 65

def unique_names!(items, field:)
  duplicates = items.group_by(&:name).reject{|name, _| name.nil? }.select{|_, matches| matches.length > 1 }.keys
  return if duplicates.empty?

  raise InvalidMetadataError, "#{field} contains duplicate names: #{duplicates.join(', ')}"
end