blob: 8ac9e679742f1f4eedd3c3a763e31a4fb3229ad2 [file] [log] [blame]
Matthias Andreas Benkardb5d657a2022-02-03 21:14:30 +01001// SPDX-FileCopyrightText: © 2021 Matthias Andreas Benkard <code@mail.matthias.benkard.de>
2//
3// SPDX-License-Identifier: LGPL-3.0-or-later
4
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +01005package eu.mulk.jgvariant.ostree;
6
Matthias Andreas Benkard91dbd742022-10-17 19:38:56 +02007import static java.nio.charset.StandardCharsets.UTF_8;
8
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +01009import eu.mulk.jgvariant.core.Decoder;
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010010import java.util.List;
11
12/**
13 * Metadata describing files and directories of a file tree.
14 *
Matthias Andreas Benkard05114642021-12-29 21:51:29 +010015 * <p>Often comes in a pair with {@link DirMeta}.
16 *
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010017 * <p>Referenced by {@link Commit#rootDirTreeChecksum()} and recursively by {@link
18 * Directory#treeChecksum()}.
19 *
20 * <p>Reference: {@code ostree-core.h#OSTREE_TREE_GVARIANT_STRING}
Matthias Andreas Benkard05114642021-12-29 21:51:29 +010021 *
22 * @param files a list of files in the directory.
23 * @param directories a list of subdirectories of the directory.
24 * @see DirMeta
25 * @see ObjectType#DIR_TREE
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010026 */
27public record DirTree(List<File> files, List<Directory> directories) {
28
Matthias Andreas Benkard05114642021-12-29 21:51:29 +010029 /**
30 * A file in a file tree.
31 *
32 * @param name the file name.
33 * @param checksum the checksum of the {@link ObjectType#FILE} object.
34 */
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010035 public record File(String name, Checksum checksum) {
36
37 private static final Decoder<File> DECODER =
Matthias Andreas Benkard91dbd742022-10-17 19:38:56 +020038 Decoder.ofStructure(File.class, Decoder.ofString(UTF_8), Checksum.decoder());
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010039
Matthias Andreas Benkard05114642021-12-29 21:51:29 +010040 /**
41 * Acquires a {@link Decoder} for the enclosing type.
42 *
43 * @return a possibly shared {@link Decoder}.
44 */
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010045 public static Decoder<File> decoder() {
46 return DECODER;
47 }
48 }
49
Matthias Andreas Benkard05114642021-12-29 21:51:29 +010050 /**
51 * A subdirectory in a file tree.
52 *
53 * @param name the name of the subdirectory.
54 * @param treeChecksum the checksum of the {@link DirTree} object.
55 * @param dirChecksum the checksum of the {@link DirMeta} object.
56 */
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010057 public record Directory(String name, Checksum treeChecksum, Checksum dirChecksum) {
58
59 private static final Decoder<Directory> DECODER =
60 Decoder.ofStructure(
Matthias Andreas Benkard91dbd742022-10-17 19:38:56 +020061 Directory.class, Decoder.ofString(UTF_8), Checksum.decoder(), Checksum.decoder());
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010062
Matthias Andreas Benkard05114642021-12-29 21:51:29 +010063 /**
64 * Acquires a {@link Decoder} for the enclosing type.
65 *
66 * @return a possibly shared {@link Decoder}.
67 */
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010068 public static Decoder<Directory> decoder() {
69 return DECODER;
70 }
71 }
72
73 private static final Decoder<DirTree> DECODER =
74 Decoder.ofStructure(
75 DirTree.class, Decoder.ofArray(File.decoder()), Decoder.ofArray(Directory.decoder()));
76
Matthias Andreas Benkard05114642021-12-29 21:51:29 +010077 /**
78 * Acquires a {@link Decoder} for the enclosing type.
79 *
80 * @return a possibly shared {@link Decoder}.
81 */
Matthias Andreas Benkard4e8423d2021-12-19 22:56:09 +010082 public static Decoder<DirTree> decoder() {
83 return DECODER;
84 }
85}