use super::git::LocalGitState;
use super::submodule::SubmoduleInfo;
use crate::ci::CiRun;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub(crate) enum Visibility {
#[default]
Visible,
Deleted,
Dismissed,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub(crate) enum WorktreeHealth {
#[default]
Normal,
Broken,
}
#[derive(Clone, Debug)]
pub(crate) struct GitHubInfo {
pub stars: u64,
pub description: Option<String>,
}
#[derive(Clone)]
pub(crate) struct ProjectCiInfo {
pub runs: Vec<CiRun>,
pub github_total: u32,
pub exhausted: bool,
}
#[derive(Clone, Default)]
pub(crate) enum ProjectCiData {
#[default]
Unfetched,
Loaded(ProjectCiInfo),
}
impl ProjectCiData {
pub(crate) const fn info(&self) -> Option<&ProjectCiInfo> {
match self {
Self::Unfetched => None,
Self::Loaded(info) => Some(info),
}
}
pub(crate) fn runs(&self) -> &[CiRun] { self.info().map_or(&[], |info| &info.runs) }
pub(crate) const fn github_total(&self) -> u32 {
match self {
Self::Unfetched => 0,
Self::Loaded(info) => info.github_total,
}
}
pub(crate) const fn is_exhausted(&self) -> bool {
match self {
Self::Unfetched => false,
Self::Loaded(info) => info.exhausted,
}
}
}
#[derive(Clone, Debug)]
pub(crate) struct LangEntry {
pub language: String,
pub files: usize,
pub code: usize,
pub comments: usize,
pub blanks: usize,
}
#[derive(Clone, Debug, Default)]
pub(crate) struct LanguageStats {
pub entries: Vec<LangEntry>,
}
#[derive(Clone, Default)]
pub(crate) struct ProjectInfo {
pub disk_usage_bytes: Option<u64>,
pub local_git_state: LocalGitState,
pub github_info: Option<GitHubInfo>,
pub ci_data: ProjectCiData,
pub language_stats: Option<LanguageStats>,
pub visibility: Visibility,
pub worktree_health: WorktreeHealth,
pub submodules: Vec<SubmoduleInfo>,
}