aboutsummaryrefslogtreecommitdiff
path: root/libgitmail/src/tree.rs
diff options
context:
space:
mode:
Diffstat (limited to 'libgitmail/src/tree.rs')
-rw-r--r--libgitmail/src/tree.rs42
1 files changed, 42 insertions, 0 deletions
diff --git a/libgitmail/src/tree.rs b/libgitmail/src/tree.rs
new file mode 100644
index 0000000..3e41c6f
--- /dev/null
+++ b/libgitmail/src/tree.rs
@@ -0,0 +1,42 @@
+//! Builder patterns to manipulate an unprocessed thread of patches
+
+use crate::Patch;
+
+/// Abstraction over a generic email
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub enum Mail<'mail> {
+ /// A git-sent email with patch information
+ Git(Patch<'mail>),
+ /// A non git-mail reply
+ Mail(String),
+}
+
+/// A tree of patches that can be filtered to yield a `PatchSet`
+pub struct PatchTree<'mail> {
+ /// The current patch
+ pub this: Mail<'mail>,
+ /// All replies to this patch mail
+ pub children: Vec<PatchTree<'mail>>,
+ /// Mark an email as selected
+ pub selected: bool,
+}
+
+impl<'mail> PatchTree<'mail> {
+ pub fn new(initial: Patch<'mail>) -> Self {
+ Self {
+ this: Mail::Git(initial),
+ children: Default::default(),
+ selected: false,
+ }
+ }
+
+ /// Select a specific mail into the tree
+ pub fn select(&mut self) {
+ self.selected = true;
+ }
+
+ /// Deselect a single mail from the tree
+ pub fn deselect(&mut self) {
+ self.selected = false;
+ }
+}