package/src/package/package.cr

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