use serde::{Deserialize, Serialize};
use crate::model::merkle_tree::node::{DirNode, FileNode};
use crate::model::metadata::generic_metadata::GenericMetadata;
use crate::model::parsed_resource::ParsedResourceView;
use crate::model::{Commit, EntryDataType, LocalRepository, StagedEntryStatus};
use crate::repositories;
use utoipa::ToSchema;
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct CLIMetadataEntry {
pub filename: String,
pub last_updated: Option<Commit>,
pub hash: String,
pub size: u64,
pub data_type: EntryDataType,
pub mime_type: String,
pub extension: String,
}
#[derive(Deserialize, Serialize, Debug, Clone, ToSchema)]
#[serde(deny_unknown_fields)]
pub struct MetadataEntry {
pub filename: String,
pub hash: String,
pub is_dir: bool,
pub latest_commit: Option<Commit>,
pub resource: Option<ParsedResourceView>,
pub size: u64,
pub data_type: EntryDataType,
pub mime_type: String,
pub extension: String,
pub metadata: Option<GenericMetadata>,
pub is_queryable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(no_recursion)]
pub children: Option<Vec<MetadataEntry>>,
}
#[derive(Deserialize, Serialize, Debug, Clone, ToSchema)]
pub struct WorkspaceMetadataEntry {
pub filename: String,
pub hash: String,
pub is_dir: bool,
pub latest_commit: Option<Commit>,
pub resource: Option<ParsedResourceView>,
pub size: u64,
pub data_type: EntryDataType,
pub mime_type: String,
pub extension: String,
pub metadata: Option<GenericMetadata>,
pub is_queryable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub changes: Option<WorkspaceChanges>,
#[serde(skip_serializing_if = "Option::is_none")]
#[schema(no_recursion)]
pub children: Option<Vec<WorkspaceMetadataEntry>>,
}
#[derive(Deserialize, Serialize, Debug, Clone, ToSchema)]
pub struct WorkspaceChanges {
pub status: StagedEntryStatus,
}
impl MetadataEntry {
pub fn from_file_node(
repo: &LocalRepository,
node: Option<FileNode>,
commit: &Commit,
) -> Option<MetadataEntry> {
node.as_ref()?;
repositories::metadata::from_file_node(repo, &node.unwrap(), commit).ok()
}
pub fn from_dir_node(
repo: &LocalRepository,
node: Option<DirNode>,
commit: &Commit,
) -> Option<MetadataEntry> {
node.as_ref()?;
repositories::metadata::from_dir_node(repo, &node.unwrap(), commit).ok()
}
}
impl WorkspaceMetadataEntry {
pub fn from_metadata_entry(metadata: MetadataEntry) -> Self {
WorkspaceMetadataEntry {
filename: metadata.filename,
hash: metadata.hash,
is_dir: metadata.is_dir,
latest_commit: metadata.latest_commit,
resource: metadata.resource,
size: metadata.size,
data_type: metadata.data_type,
mime_type: metadata.mime_type,
extension: metadata.extension,
metadata: metadata.metadata,
is_queryable: metadata.is_queryable,
changes: None,
children: metadata
.children
.map(|c| c.into_iter().map(Self::from_metadata_entry).collect()),
}
}
}