use std::collections::BTreeMap;
use std::ops::AddAssign;
use std::path::PathBuf;
use tokei::LanguageType;
pub type NodeId = usize;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum NodeKind {
Dir,
File,
}
#[derive(Debug, Clone)]
pub struct TreeNode {
pub name: String,
pub rel_path: PathBuf,
pub kind: NodeKind,
pub depth: usize,
pub parent: Option<NodeId>,
pub children: Vec<NodeId>,
pub expanded: bool,
pub bytes: u64,
pub files: usize,
}
impl TreeNode {
pub fn dir(name: String, rel_path: PathBuf, parent: Option<NodeId>, depth: usize) -> Self {
Self {
name,
rel_path,
kind: NodeKind::Dir,
depth,
parent,
children: Vec::new(),
expanded: false,
bytes: 0,
files: 0,
}
}
pub fn file(name: String, rel_path: PathBuf, parent: Option<NodeId>, depth: usize) -> Self {
Self {
kind: NodeKind::File,
..Self::dir(name, rel_path, parent, depth)
}
}
pub fn is_dir(&self) -> bool {
self.kind == NodeKind::Dir
}
}
#[derive(Debug, Clone)]
pub struct Tree {
pub nodes: Vec<TreeNode>,
pub root: NodeId,
pub index: std::collections::HashMap<PathBuf, NodeId>,
}
impl Tree {
pub fn total_bytes(&self) -> u64 {
self.nodes[self.root].bytes
}
pub fn total_files(&self) -> usize {
self.nodes[self.root].files
}
}
#[derive(Debug, Clone, Default)]
pub enum Layer<T> {
#[default]
NotComputed,
Computing,
Ready(Box<[T]>),
}
impl<T> Layer<T> {
pub fn ready(&self) -> Option<&[T]> {
match self {
Layer::Ready(values) => Some(values),
_ => None,
}
}
pub fn is_computing(&self) -> bool {
matches!(self, Layer::Computing)
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct CodeNum {
pub code: usize,
pub comments: usize,
pub blanks: usize,
}
impl CodeNum {
pub fn lines(&self) -> usize {
self.code + self.comments + self.blanks
}
}
impl AddAssign for CodeNum {
fn add_assign(&mut self, rhs: Self) {
self.code += rhs.code;
self.comments += rhs.comments;
self.blanks += rhs.blanks;
}
}
#[derive(Debug, Clone, Default)]
pub struct CodeData {
pub num: CodeNum,
pub langs: BTreeMap<LanguageType, CodeNum>,
pub primary_lang: Option<LanguageType>,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct ChurnData {
pub added: u64,
pub deleted: u64,
pub commits: u64,
}
impl ChurnData {
pub fn churn(&self) -> u64 {
self.added + self.deleted
}
}
impl AddAssign for ChurnData {
fn add_assign(&mut self, rhs: Self) {
self.added += rhs.added;
self.deleted += rhs.deleted;
self.commits += rhs.commits;
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct StatusData {
pub added: usize,
pub modified: usize,
pub deleted: usize,
}
impl StatusData {
pub fn total(&self) -> usize {
self.added + self.modified + self.deleted
}
}
impl AddAssign for StatusData {
fn add_assign(&mut self, rhs: Self) {
self.added += rhs.added;
self.modified += rhs.modified;
self.deleted += rhs.deleted;
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SortDir {
Asc,
Desc,
}
impl SortDir {
pub fn flip(self) -> Self {
match self {
SortDir::Asc => SortDir::Desc,
SortDir::Desc => SortDir::Asc,
}
}
pub fn arrow(self) -> &'static str {
match self {
SortDir::Asc => "↑",
SortDir::Desc => "↓",
}
}
}