91 lines
1.7 KiB
Crystal
91 lines
1.7 KiB
Crystal
require "specparser"
|
|
|
|
require "./exception.cr"
|
|
|
|
class Package::Package
|
|
getter name : String
|
|
getter version : String
|
|
getter release : Int32
|
|
getter slot : String
|
|
|
|
getter dependencies = Array(Atom).new
|
|
|
|
property file_path : String
|
|
|
|
def initialize(@file_path)
|
|
specs = SpecParser.parse File.read file_path
|
|
|
|
name : String? = nil
|
|
version : String? = nil
|
|
release : Int32? = nil
|
|
slot : String? = nil
|
|
|
|
specs.assignments.each do |key, value|
|
|
case key
|
|
when "name"
|
|
name = value.as_s
|
|
when "version"
|
|
version = value.as_s
|
|
when "release"
|
|
release = value.as_s.to_i
|
|
when "slot"
|
|
slot = value.as_s
|
|
when "dependencies"
|
|
@dependencies = value.as_a_or_s.map do |s|
|
|
Atom.from_string s
|
|
end
|
|
end
|
|
end
|
|
|
|
@name = name.not_nil!
|
|
@version = version.not_nil!
|
|
@release = release.not_nil!
|
|
@slot = slot.not_nil!
|
|
end
|
|
|
|
def initialize(section : SpecParser::Section)
|
|
@file_path, @name, @version, release, @slot = section.options[0].split " "
|
|
@release = release.to_i
|
|
|
|
section.content.each do |key, value|
|
|
case key
|
|
when "dependencies"
|
|
@dependencies = value.as_a_or_s.map do |s|
|
|
Atom.from_string s
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def to_atom
|
|
Atom.new @name, slot: @slot
|
|
end
|
|
def matches?(atom : Atom)
|
|
return false unless @name == atom.name
|
|
|
|
if slot = atom.slot
|
|
return false unless @slot == atom.slot
|
|
end
|
|
|
|
true
|
|
end
|
|
|
|
# Returns Array({package, file_name})
|
|
def self.parse_repository_index(file_path : String) : Array(Package)
|
|
output = Array(Tuple(Package, String)).new
|
|
specs = SpecParser.parse File.read file_path
|
|
|
|
specs.sections.each do |section|
|
|
case section.name
|
|
when "package"
|
|
package = Package.new section
|
|
|
|
output << {package, file_name}
|
|
end
|
|
end
|
|
|
|
output
|
|
end
|
|
end
|
|
|