///|
pub type DataRefId = String

///|
pub type ArtifactId = String

///|
pub(all) struct DataRef {
  ref_id : DataRefId
  kind : String
  uri : String
  content_type : String
  byte_count : Int64
  checksum : DeclaredChecksum
} derive(Debug, Eq, ToJson, FromJson)

///|
pub(all) struct ArtifactRef {
  artifact_kind : String
  artifact_id : ArtifactId
  manifest_path : String
  status : DataStatus
  summary : String
} derive(Debug, Eq, ToJson, FromJson)

///|
pub fn data_ref(
  ref_id : DataRefId,
  kind : String,
  uri : String,
  content_type? : String = "application/octet-stream",
  byte_count? : Int64 = 0L,
  checksum? : DeclaredChecksum = declared_checksum(NoChecksum, ""),
) -> DataRef {
  { ref_id, kind, uri, content_type, byte_count, checksum }
}

///|
pub fn artifact_ref(
  artifact_kind : String,
  artifact_id : ArtifactId,
  manifest_path : String,
  status? : DataStatus = UnknownStatus,
  summary? : String = "",
) -> ArtifactRef {
  { artifact_kind, artifact_id, manifest_path, status, summary }
}

///|
pub fn artifact_ref_status_label(artifact : ArtifactRef) -> String {
  data_status_label(artifact.status)
}