One artifact a release composes, together with where it resolves to on this machine.
:path is where the artifact belongs in the configured cache, whether or not
anything is there: :present? is what says a file is actually sitting at it.
Reporting the two separately is what lets a caller name the path an operator
has to place a licensed file at, rather than only reporting that something is
missing.
Every other field restates the catalog row the artifact was read from, so a caller that has this struct never has to go back to the catalog for the checksum it should verify against or the source release it came from.
Summary
Types
@type t() :: %GeoGenius.ReleaseArtifacts.Artifact{ artifact_id: Ecto.UUID.t(), cache_key: String.t(), collection_key: String.t(), expected_bytes: integer(), expected_sha256: String.t(), format: String.t(), logical_name: String.t(), metadata: map(), observed_bytes: integer() | nil, observed_sha256: String.t() | nil, operator_supplied: boolean(), path: Path.t(), present?: boolean(), release_id: Ecto.UUID.t(), source_key: String.t(), source_release_id: Ecto.UUID.t(), source_release_key: String.t(), url: String.t() | nil, validated_at: DateTime.t() | nil }