/**
 * Provides record classes describing the elements of <a
 * href="https://ostreedev.github.io/ostree/">OSTree</a> repositories and factory methods to create
 * {@link eu.mulk.jgvariant.core.Decoder} instances for them.
 *
 * <h2>OStree repository structure</h2>
 *
 * <p>An OSTree repository has the following layout:
 *
 * <dl>
 *   <dt>{@code config}
 *   <dd>
 *       <p>A plain text file that contains various settings. Among other things, this defines the
 *       <a href="https://ostreedev.github.io/ostree/formats/#the-archive-format">archive format</a>
 *       of the repository and whether files are compressed ({@code mode=archive-z2}) or plain
 *       ({@code mode=bare}, {@code mode=bare-user}).
 *   <dt>{@code summary}
 *   <dd>
 *       <p>A {@link eu.mulk.jgvariant.ostree.Summary} object containing information on what is
 *       available under {@code refs/}, {@code deltas/}, and {@code delta-indexes/}.
 *       <p>This file may or may not exist and, if it exists, may or may not be up to date.
 *   <dt>{@code refs/heads{/name...}}
 *   <dd>
 *       <p>Plain-text files containing {@link eu.mulk.jgvariant.ostree.Checksum}s in hex format
 *       (see {@link eu.mulk.jgvariant.ostree.Checksum#ofHex}) referring to {@link
 *       eu.mulk.jgvariant.ostree.Commit} objects. See below for the layout of the {@code objects/}
 *       directory that this refers to.
 *   <dt>{@code objects/{ξ₀ξ₁}/{ξ₂ξ₃ξ₄ξ₅...}.{ext}}
 *   <dd>
 *       <p>Objects of various types as described by {@link eu.mulk.jgvariant.ostree.ObjectType} and
 *       keyed by {@link eu.mulk.jgvariant.ostree.Checksum}.
 *       <p>Among other things, this is where you find {@link eu.mulk.jgvariant.ostree.Commit}
 *       ({@code .commit)}, {@link eu.mulk.jgvariant.ostree.DirTree} ({@code .dirtree}), and {@link
 *       eu.mulk.jgvariant.ostree.DirMeta} ({@code .dirmeta}) objects as well as plain ({@code
 *       .file}) or compressed files ({@code .filez}).
 *       <p>Static delta information is not stored here, but in the {@code deltas/} and {@code
 *       delta-indexes/} directories (if available).
 *       <p>The individual parts of the file path are defined as follows:
 *       <dl>
 *         <dt>{@code {ξ₀ξ₁}}
 *         <dd>the first two characters of {@link eu.mulk.jgvariant.ostree.Checksum#hex()}
 *         <dt>{@code {ξ₂ξ₃ξ₄ξ₅...}}
 *         <dd>the substring of {@link eu.mulk.jgvariant.ostree.Checksum#hex()} starting from the
 *             3rd character
 *         <dt>{@code {ext}}
 *         <dd>the {@link eu.mulk.jgvariant.ostree.ObjectType#fileExtension()} of the object type
 *       </dl>
 *   <dt id="delta-superblock">{@code objects/{μ₀μ₁}/{μ₂μ₃μ₄μ₅...}.{ext}}/superblock
 *   <dd>
 *       <p>A {@link eu.mulk.jgvariant.ostree.DeltaSuperblock} to get from nothing (an empty commit)
 *       to the commit named by the checksum encoded in the path.
 *       <p>The individual parts of the file path are defined as follows:
 *       <dl>
 *         <dt>{@code {μ₀μ₁}}
 *         <dd>the first two characters of {@link
 *             eu.mulk.jgvariant.ostree.Checksum#modifiedBase64()} of the target commit the delta
 *             ends at
 *         <dt>{@code {μ₂μ₃μ₄μ₅...}}
 *         <dd>the substring of {@link eu.mulk.jgvariant.ostree.Checksum#modifiedBase64()} of the
 *             target commit the delta ends at starting from the 3rd character
 *       </dl>
 *   <dt>{@code deltas/{ν₀ν₁}/{ν₂ν₃ν₄ν₅...}/{digit...}}
 *   <dd>
 *       <p>A {@link eu.mulk.jgvariant.ostree.DeltaPartPayload} belonging to a delta that goes from
 *       nothing (an empty commit) to the commit named by the checksum encoded in the path.
 *       <p>The individual parts of the file path are defined as follows:
 *       <dl>
 *         <dt>{@code {ν₀ν₁}}
 *         <dd>the first two characters of {@link
 *             eu.mulk.jgvariant.ostree.Checksum#modifiedBase64()} of the target commit the delta
 *             ends at
 *         <dt>{@code {ν₂ν₃ν₄ν₅...}}
 *         <dd>the substring of {@link eu.mulk.jgvariant.ostree.Checksum#modifiedBase64()} of the
 *             target commit the delta ends at starting from the 3rd character
 *       </dl>
 *   <dt>{@code deltas/{μ₀μ₁}/{μ₂μ₃μ₄μ₅...}-{ν₀ν₁ν₂ν₃ν₄ν₅...}/superblock}
 *   <dd>
 *       <p>A {@link eu.mulk.jgvariant.ostree.DeltaSuperblock} to get from the source commit
 *       referenced by the first checksum encoded in the path to the target commit referenced in the
 *       second checksum encoded in the path.
 *       <p>The individual parts of the file path are defined as follows:
 *       <dl>
 *         <dt>{@code {μ₀μ₁}}
 *         <dd>the first two characters of {@link
 *             eu.mulk.jgvariant.ostree.Checksum#modifiedBase64()} of the source commit the delta
 *             starts from
 *         <dt>{@code {μ₂μ₃μ₄μ₅...}}
 *         <dd>the substring of {@link eu.mulk.jgvariant.ostree.Checksum#modifiedBase64()} of the
 *             source commit the delta starts from starting from the 3rd character
 *         <dt>{@code {ν₀ν₁ν₂ν₃ν₄ν₅...}}
 *         <dd>the full {@link eu.mulk.jgvariant.ostree.Checksum#modifiedBase64()} of the target
 *             commit the delta ends at
 *       </dl>
 *   <dt>{@code deltas/{μ₀μ₁}/{μ₂μ₃μ₄μ₅...}-{ν₀ν₁ν₂ν₃ν₄ν₅...}/{digit...}}
 *   <dd>
 *       <p>A {@link eu.mulk.jgvariant.ostree.DeltaPartPayload} belonging to a delta that goes from
 *       the source commit referenced by the first checksum encoded in the path to the target commit
 *       referenced in the second checksum encoded in the path.
 *       <p>The individual parts of the file path are defined as follows:
 *       <dl>
 *         <dt>{@code {μ₀μ₁}}
 *         <dd>the first two characters of {@link
 *             eu.mulk.jgvariant.ostree.Checksum#modifiedBase64()} of the source commit the delta
 *             starts from
 *         <dt>{@code {μ₂μ₃μ₄μ₅...}}
 *         <dd>the substring of {@link eu.mulk.jgvariant.ostree.Checksum#modifiedBase64()} of the
 *             source commit the delta starts from starting from the 3rd character
 *         <dt>{@code {ν₀ν₁ν₂ν₃ν₄ν₅...}}
 *         <dd>the full {@link eu.mulk.jgvariant.ostree.Checksum#modifiedBase64()} of the target
 *             commit the delta ends at
 *       </dl>
 * </dl>
 */
@API(status = Status.EXPERIMENTAL)
package eu.mulk.jgvariant.ostree;

import org.apiguardian.api.API;
import org.apiguardian.api.API.Status;
