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        #[serde(default)]
36        next_cursor: Option<String>,
37        /// Whether more entries are available.
38        #[serde(default)]
39        has_more: bool,
40    },
41}
42
43/// The type of a directory entry.
44#[derive(Debug, Clone, Deserialize)]
45pub enum DirEntryType {
46    /// A file.
47    #[serde(rename = "file")]
48    File,
49    /// A subdirectory.
50    #[serde(rename = "dir")]
51    Dir,
52}
53
54/// An entry within a directory listing.
55#[derive(Debug, Clone, Deserialize)]
56pub struct DirEntry {
57    /// Type of entry (`"file"` or `"dir"`).
58    #[serde(rename = "type")]
59    pub entry_type: DirEntryType,
60    /// Entry name.
61    pub name: String,
62    /// Entry path.
63    pub path: String,
64    /// Object SHA.
65    pub sha: String,
66    /// Size in bytes (files only).
67    pub size: Option<u64>,
68}