Skip to main content

mesa_dev/models/
content.rs

1//! Content models.
2
3use serde::Deserialize;
4
5/// Repository content — either a file or a directory.
6#[derive(Debug, Clone, Deserialize)]
7#[serde(tag = "type", rename_all = "lowercase")]
8pub enum Content {
9    /// A file entry.
10    File {
11        /// File name.
12        name: String,
13        /// File path.
14        path: String,
15        /// Object SHA.
16        sha: String,
17        /// File size in bytes.
18        size: u64,
19        /// Content encoding (e.g. `"base64"`).
20        encoding: String,
21        /// Encoded file content.
22        content: String,
23    },
24    /// A directory entry.
25    Dir {
26        /// Directory name.
27        name: String,
28        /// Directory path.
29        path: String,
30        /// Object SHA.
31        sha: String,
32        /// Directory entries.
33        entries: Vec<DirEntry>,
34        /// Cursor for the next page of entries.
35        next_cursor: Option<String>,
36        /// Whether more entries are available.
37        has_more: bool,
38    },
39}
40
41/// The type of a directory entry.
42#[derive(Debug, Clone, Deserialize)]
43pub enum DirEntryType {
44    /// A file.
45    #[serde(rename = "file")]
46    File,
47    /// A subdirectory.
48    #[serde(rename = "dir")]
49    Dir,
50}
51
52/// An entry within a directory listing.
53#[derive(Debug, Clone, Deserialize)]
54pub struct DirEntry {
55    /// Type of entry (`"file"` or `"dir"`).
56    #[serde(rename = "type")]
57    pub entry_type: DirEntryType,
58    /// Entry name.
59    pub name: String,
60    /// Entry path.
61    pub path: String,
62    /// Object SHA.
63    pub sha: String,
64    /// Size in bytes (files only).
65    pub size: Option<u64>,
66}