Class: Factorix::Dependency::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/factorix/dependency/parser.rb

Overview

Parser for MOD dependency strings using Parslet

This class parses dependency strings from info.json files and converts them into Dependency::Entry objects using a PEG-based parser.

Examples:

Parsing various dependency formats

parser = Dependency::Parser.new

# Required dependency
dep1 = parser.parse("base")

# Optional dependency with version
dep2 = parser.parse("? some-mod >= 1.2.0")

# Incompatible MOD
dep3 = parser.parse("! bad-mod")

# Hidden optional
dep4 = parser.parse("(?) hidden-mod")

# Load-neutral
dep5 = parser.parse("~ neutral-mod")

Defined Under Namespace

Classes: Grammar, Transform

Instance Method Summary collapse

Constructor Details

#initializeParser

Returns a new instance of Parser.



93
94
95
96
# File 'lib/factorix/dependency/parser.rb', line 93

def initialize
  @grammar = Grammar.new
  @transform = Transform.new
end

Instance Method Details

#parse(dependency_string) ⇒ Entry

Parse a dependency string into a Dependency::Entry object

Parameters:

  • dependency_string (String)

    Dependency string to parse

Returns:

  • (Entry)

    Parsed dependency object

Raises:



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/factorix/dependency/parser.rb', line 103

def parse(dependency_string)
  raise DependencyParseError, "dependency_string cannot be nil or empty" if dependency_string.nil? || dependency_string.empty?

  begin
    tree = @grammar.parse(dependency_string)
    data = @transform.apply(tree)

    mod_name = data[:mod_name].to_s
    mod = MOD[name: mod_name]
    type = data.dig(:prefix, :type) || Entry::REQUIRED
    version_requirement = build_version_requirement(data[:requirement])

    Entry[mod:, type:, version_requirement:]
  rescue Parslet::ParseFailed => e
    raise DependencyParseError, parse_error_message(dependency_string, e)
  end
end