add support for tags :-) #18
3 changed files with 31 additions and 0 deletions
17
src/issue.rs
17
src/issue.rs
|
|
@ -22,6 +22,7 @@ pub type IssueHandle = String;
|
||||||
pub struct Issue {
|
pub struct Issue {
|
||||||
pub author: String,
|
pub author: String,
|
||||||
pub timestamp: chrono::DateTime<chrono::Local>,
|
pub timestamp: chrono::DateTime<chrono::Local>,
|
||||||
|
pub tags: Vec<String>,
|
||||||
pub state: State,
|
pub state: State,
|
||||||
pub dependencies: Option<Vec<IssueHandle>>,
|
pub dependencies: Option<Vec<IssueHandle>>,
|
||||||
pub assignee: Option<String>,
|
pub assignee: Option<String>,
|
||||||
|
|
@ -97,6 +98,7 @@ impl Issue {
|
||||||
let mut dependencies: Option<Vec<String>> = None;
|
let mut dependencies: Option<Vec<String>> = None;
|
||||||
let mut comments = Vec::<crate::comment::Comment>::new();
|
let mut comments = Vec::<crate::comment::Comment>::new();
|
||||||
let mut assignee: Option<String> = None;
|
let mut assignee: Option<String> = None;
|
||||||
|
let mut tags = Vec::<String>::new();
|
||||||
|
|
||||||
for direntry in dir.read_dir()? {
|
for direntry in dir.read_dir()? {
|
||||||
if let Ok(direntry) = direntry {
|
if let Ok(direntry) = direntry {
|
||||||
|
|
@ -119,6 +121,13 @@ impl Issue {
|
||||||
if deps.len() > 0 {
|
if deps.len() > 0 {
|
||||||
dependencies = Some(deps);
|
dependencies = Some(deps);
|
||||||
}
|
}
|
||||||
|
} else if file_name == "tags" {
|
||||||
|
let contents = std::fs::read_to_string(direntry.path())?;
|
||||||
|
tags = contents
|
||||||
|
.lines()
|
||||||
|
.filter(|s| s.len() > 0)
|
||||||
|
.map(|tag| String::from(tag.trim()))
|
||||||
|
.collect();
|
||||||
} else if file_name == "comments" && direntry.metadata()?.is_dir() {
|
} else if file_name == "comments" && direntry.metadata()?.is_dir() {
|
||||||
Self::read_comments(&mut comments, &direntry.path())?;
|
Self::read_comments(&mut comments, &direntry.path())?;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -138,6 +147,7 @@ impl Issue {
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
author,
|
author,
|
||||||
timestamp,
|
timestamp,
|
||||||
|
tags,
|
||||||
state: state,
|
state: state,
|
||||||
dependencies,
|
dependencies,
|
||||||
assignee,
|
assignee,
|
||||||
|
|
@ -192,6 +202,7 @@ impl Issue {
|
||||||
let mut issue = Self {
|
let mut issue = Self {
|
||||||
author: String::from(""),
|
author: String::from(""),
|
||||||
timestamp: chrono::Local::now(),
|
timestamp: chrono::Local::now(),
|
||||||
|
tags: Vec::<String>::new(),
|
||||||
state: State::New,
|
state: State::New,
|
||||||
dependencies: None,
|
dependencies: None,
|
||||||
assignee: None,
|
assignee: None,
|
||||||
|
|
@ -372,6 +383,11 @@ mod tests {
|
||||||
timestamp: chrono::DateTime::parse_from_rfc3339("2025-07-03T12:14:26-06:00")
|
timestamp: chrono::DateTime::parse_from_rfc3339("2025-07-03T12:14:26-06:00")
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.with_timezone(&chrono::Local),
|
.with_timezone(&chrono::Local),
|
||||||
|
tags: Vec::<String>::from([
|
||||||
|
String::from("tag1"),
|
||||||
|
String::from("TAG2"),
|
||||||
|
String::from("i-am-also-a-tag")
|
||||||
|
]),
|
||||||
state: State::New,
|
state: State::New,
|
||||||
dependencies: None,
|
dependencies: None,
|
||||||
assignee: None,
|
assignee: None,
|
||||||
|
|
@ -391,6 +407,7 @@ mod tests {
|
||||||
timestamp: chrono::DateTime::parse_from_rfc3339("2025-07-03T12:14:26-06:00")
|
timestamp: chrono::DateTime::parse_from_rfc3339("2025-07-03T12:14:26-06:00")
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.with_timezone(&chrono::Local),
|
.with_timezone(&chrono::Local),
|
||||||
|
tags: Vec::<String>::new(),
|
||||||
state: State::InProgress,
|
state: State::InProgress,
|
||||||
dependencies: None,
|
dependencies: None,
|
||||||
assignee: Some(String::from("beep boop")),
|
assignee: Some(String::from("beep boop")),
|
||||||
|
|
|
||||||
|
|
@ -100,6 +100,7 @@ mod tests {
|
||||||
timestamp: chrono::DateTime::parse_from_rfc3339("2025-07-03T12:14:26-06:00")
|
timestamp: chrono::DateTime::parse_from_rfc3339("2025-07-03T12:14:26-06:00")
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.with_timezone(&chrono::Local),
|
.with_timezone(&chrono::Local),
|
||||||
|
tags: Vec::<String>::new(),
|
||||||
state: crate::issue::State::InProgress,
|
state: crate::issue::State::InProgress,
|
||||||
dependencies: None,
|
dependencies: None,
|
||||||
assignee: Some(String::from("beep boop")),
|
assignee: Some(String::from("beep boop")),
|
||||||
|
|
@ -119,6 +120,11 @@ mod tests {
|
||||||
timestamp: chrono::DateTime::parse_from_rfc3339("2025-07-03T12:14:26-06:00")
|
timestamp: chrono::DateTime::parse_from_rfc3339("2025-07-03T12:14:26-06:00")
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.with_timezone(&chrono::Local),
|
.with_timezone(&chrono::Local),
|
||||||
|
tags: Vec::<String>::from([
|
||||||
|
String::from("tag1"),
|
||||||
|
String::from("TAG2"),
|
||||||
|
String::from("i-am-also-a-tag")
|
||||||
|
]),
|
||||||
state: crate::issue::State::New,
|
state: crate::issue::State::New,
|
||||||
dependencies: None,
|
dependencies: None,
|
||||||
assignee: None,
|
assignee: None,
|
||||||
|
|
@ -147,6 +153,7 @@ mod tests {
|
||||||
timestamp: chrono::DateTime::parse_from_rfc3339("2025-07-03T11:59:44-06:00")
|
timestamp: chrono::DateTime::parse_from_rfc3339("2025-07-03T11:59:44-06:00")
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.with_timezone(&chrono::Local),
|
.with_timezone(&chrono::Local),
|
||||||
|
tags: Vec::<String>::new(),
|
||||||
state: crate::issue::State::Done,
|
state: crate::issue::State::Done,
|
||||||
dependencies: None,
|
dependencies: None,
|
||||||
assignee: None,
|
assignee: None,
|
||||||
|
|
@ -180,6 +187,7 @@ mod tests {
|
||||||
timestamp: chrono::DateTime::parse_from_rfc3339("2025-07-03T11:59:44-06:00")
|
timestamp: chrono::DateTime::parse_from_rfc3339("2025-07-03T11:59:44-06:00")
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.with_timezone(&chrono::Local),
|
.with_timezone(&chrono::Local),
|
||||||
|
tags: Vec::<String>::new(),
|
||||||
state: crate::issue::State::WontDo,
|
state: crate::issue::State::WontDo,
|
||||||
dependencies: None,
|
dependencies: None,
|
||||||
assignee: None,
|
assignee: None,
|
||||||
|
|
@ -208,6 +216,7 @@ mod tests {
|
||||||
timestamp: chrono::DateTime::parse_from_rfc3339("2025-07-05T13:55:49-06:00")
|
timestamp: chrono::DateTime::parse_from_rfc3339("2025-07-05T13:55:49-06:00")
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.with_timezone(&chrono::Local),
|
.with_timezone(&chrono::Local),
|
||||||
|
tags: Vec::<String>::new(),
|
||||||
state: crate::issue::State::Done,
|
state: crate::issue::State::Done,
|
||||||
dependencies: None,
|
dependencies: None,
|
||||||
assignee: None,
|
assignee: None,
|
||||||
|
|
@ -227,6 +236,7 @@ mod tests {
|
||||||
timestamp: chrono::DateTime::parse_from_rfc3339("2025-07-05T13:55:49-06:00")
|
timestamp: chrono::DateTime::parse_from_rfc3339("2025-07-05T13:55:49-06:00")
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.with_timezone(&chrono::Local),
|
.with_timezone(&chrono::Local),
|
||||||
|
tags: Vec::<String>::new(),
|
||||||
state: crate::issue::State::WontDo,
|
state: crate::issue::State::WontDo,
|
||||||
dependencies: None,
|
dependencies: None,
|
||||||
assignee: None,
|
assignee: None,
|
||||||
|
|
@ -246,6 +256,7 @@ mod tests {
|
||||||
timestamp: chrono::DateTime::parse_from_rfc3339("2025-07-05T13:55:49-06:00")
|
timestamp: chrono::DateTime::parse_from_rfc3339("2025-07-05T13:55:49-06:00")
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.with_timezone(&chrono::Local),
|
.with_timezone(&chrono::Local),
|
||||||
|
tags: Vec::<String>::new(),
|
||||||
state: crate::issue::State::WontDo,
|
state: crate::issue::State::WontDo,
|
||||||
dependencies: Some(vec![
|
dependencies: Some(vec![
|
||||||
crate::issue::IssueHandle::from("3fa5bfd93317ad25772680071d5ac3259cd2384f"),
|
crate::issue::IssueHandle::from("3fa5bfd93317ad25772680071d5ac3259cd2384f"),
|
||||||
|
|
|
||||||
3
test/0000/3943fc5c173fdf41c0a22251593cd476d96e6c9f/tags
Normal file
3
test/0000/3943fc5c173fdf41c0a22251593cd476d96e6c9f/tags
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
tag1
|
||||||
|
TAG2
|
||||||
|
i-am-also-a-tag
|
||||||
Loading…
Add table
Add a link
Reference in a new issue