use crate::{hash_one, repo, AHash};
use std::borrow::Cow;
#[derive(Debug)]
pub enum FileContent<'a> {
Decoded(Cow<'a, str>),
Image(Vec<u8>),
UnknownEncoding,
}
#[derive(Debug)]
pub enum File {
Decoded(DecodedFile),
Undecodable(UndecodableFile),
Image(Vec<u8>),
}
#[derive(Debug)]
pub struct DecodedFile {
pub combined: Combined,
pub diffs_without_contents: Vec<DiffWithoutContents>,
}
#[derive(Debug)]
pub struct UndecodableFile {
pub diffs_with_contents: Vec<(DiffWithContents, IdHash)>,
pub diffs_without_contents: Vec<DiffWithoutContents>,
}
#[derive(Debug)]
pub struct Combined {
pub sections: Vec<Section>,
pub max_line_num: usize,
}
#[derive(Debug)]
pub enum DiffWithContents {
Add {
contents: Option<String>,
},
Edit {
line: usize,
deleted: bool,
contents: String,
},
Replacement {
line: usize,
change_contents: String,
replacement_contents: String,
},
Del {
contents: Option<String>,
},
Undel,
}
#[derive(Debug)]
pub enum DiffWithoutContents {
Move {
old_path: String,
},
MoveEdge,
Del,
SolveNameConflict,
UnsolveNameConflict,
SolveOrderConflict,
UnsolveOrderConflict,
ResurrectZombines,
AddRoot,
DelRoot,
Edit {
line: usize,
deleted: bool,
contents: UndecodableContents,
},
Replacement {
line: usize,
change_contents: UndecodableContents,
replacement_contents: UndecodableContents,
},
}
#[derive(Debug)]
pub enum UndecodableContents {
ShortBase64(String),
UnknownEncoding,
}
#[derive(Debug)]
pub enum Section {
Unchanged(Lines),
Changed {
deleted: Lines,
added: Lines,
diff_id: IdHash,
},
}
pub type Lines = Vec<String>;
pub fn contents_to_lines(contents: &str) -> Lines {
contents.split('\n').map(str::to_string).collect()
}
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
pub struct Id {
pub diff: repo::ChangedFileDiff,
}
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
pub struct IdRef<'a> {
pub diff: &'a repo::ChangedFileDiff,
}
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub struct IdHash(pub AHash);
pub fn id_hash(id: &Id) -> IdHash {
IdHash(hash_one(id))
}
pub fn id_ref_hash(id: &IdRef<'_>) -> IdHash {
IdHash(hash_one(id))
}
pub fn id_parts_hash(diff: &repo::ChangedFileDiff) -> IdHash {
id_ref_hash(&IdRef { diff })
}