Module: Textus::Meta

Defined in:
lib/textus/meta.rb

Constant Summary collapse

NO_META_FORMATS =
%w[text].freeze
FIELDS =
{
  "uid" => {
    inject: lambda { |meta, content, existing_meta|
      m = meta.is_a?(Hash) ? meta.dup : {}
      existing = existing_meta.is_a?(Hash) ? existing_meta["uid"] : nil
      m["uid"] = existing || Textus::Value::Uid.mint unless m["uid"].is_a?(String) && !m["uid"].empty?
      [m, content]
    },
  },
  "sources" => {
    inject: lambda { |meta, content, existing_meta|
      m = meta.is_a?(Hash) ? meta.dup : {}
      existing = existing_meta.is_a?(Hash) ? existing_meta["sources"] : nil

      if m.key?("sources")
        raise Textus::BadContent.new(nil, "_meta.sources must be an array") unless m["sources"].is_a?(Array)

        m["sources"] = m["sources"].map { |s| validate_source_shape!(s) }
      elsif existing.is_a?(Array) && !existing.empty?
        m["sources"] = existing
      end

      [m, content]
    },
  },
}.freeze

Class Method Summary collapse

Class Method Details

.inject_all(meta, content, existing_meta = {}, format: nil) ⇒ Object



36
37
38
39
40
41
42
43
44
# File 'lib/textus/meta.rb', line 36

def self.inject_all(meta, content, existing_meta = {}, format: nil)
  return [meta, content] if NO_META_FORMATS.include?(format)

  FIELDS.each_value do |field|
    meta, content = field[:inject].call(meta, content, existing_meta)
  end

  [meta, content]
end

.validate_source_shape!(src) ⇒ Object

Raises:



46
47
48
49
50
51
52
# File 'lib/textus/meta.rb', line 46

def self.validate_source_shape!(src)
  raise Textus::BadContent.new(nil, "each source must be a string") unless src.is_a?(String)

  raise Textus::BadContent.new(nil, "each source must start with 'raw.', got #{src.inspect}") unless src.match?(/\Araw\./)

  src
end