Artifact

use "collections"
use "../version"
use "../utils"

class Artifact is (ComparableMixin[Artifact] & Hashable & Stringable)
  let name: String
  let version: Version
  let depends_on: Array[Constraint]

  new create(
    name': String,
    version': Version,
    depends_on': Array[Constraint] = Array[Constraint]
  ) =>
    name = name'
    version = version'
    depends_on = depends_on'

  fun compare(that: Artifact box): Compare =>
    if (name != that.name) then return name.compare(that.name) end
    version.compare(that.version)

  fun hash(): USize =>
    name.hash() xor version.hash()

  fun string(): String iso^ =>
    let result = recover String() end
    result.append(name + " @ " + version.string() + " -> [" + ",".join(depends_on.values()) + "]")
    result