mirror of
https://github.com/nikolassv/bartib
synced 2024-09-20 14:12:00 +00:00
added error types for task string parsing
This commit is contained in:
parent
e583c5b4cf
commit
7f366ee0d8
3 changed files with 81 additions and 6 deletions
56
Cargo.lock
generated
56
Cargo.lock
generated
|
@ -32,6 +32,7 @@ version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"clap",
|
"clap",
|
||||||
|
"thiserror",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -102,12 +103,41 @@ dependencies = [
|
||||||
"autocfg",
|
"autocfg",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro2"
|
||||||
|
version = "1.0.24"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-xid",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quote"
|
||||||
|
version = "1.0.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "strsim"
|
name = "strsim"
|
||||||
version = "0.8.0"
|
version = "0.8.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
|
checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "1.0.65"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f3a1d708c221c5a612956ef9f75b37e454e88d1f7b899fbd3a18d4252012d663"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-xid",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "textwrap"
|
name = "textwrap"
|
||||||
version = "0.11.0"
|
version = "0.11.0"
|
||||||
|
@ -117,6 +147,26 @@ dependencies = [
|
||||||
"unicode-width",
|
"unicode-width",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thiserror"
|
||||||
|
version = "1.0.24"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e"
|
||||||
|
dependencies = [
|
||||||
|
"thiserror-impl",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thiserror-impl"
|
||||||
|
version = "1.0.24"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "time"
|
name = "time"
|
||||||
version = "0.1.44"
|
version = "0.1.44"
|
||||||
|
@ -134,6 +184,12 @@ version = "0.1.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
|
checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-xid"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "vec_map"
|
name = "vec_map"
|
||||||
version = "0.8.2"
|
version = "0.8.2"
|
||||||
|
|
|
@ -8,4 +8,5 @@ license = "GPL-3.0-or-later"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
chrono = "0.4"
|
chrono = "0.4"
|
||||||
clap = "~2.33"
|
clap = "~2.33"
|
||||||
|
thiserror = "1.0"
|
28
src/task.rs
28
src/task.rs
|
@ -1,6 +1,7 @@
|
||||||
use chrono::{NaiveDateTime, Local};
|
use chrono::{NaiveDateTime, Local};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::str::{FromStr, Chars};
|
use std::str::{FromStr, Chars};
|
||||||
|
use thiserror::Error;
|
||||||
|
|
||||||
use crate::project;
|
use crate::project;
|
||||||
use crate::conf;
|
use crate::conf;
|
||||||
|
@ -9,10 +10,19 @@ use crate::conf;
|
||||||
pub struct Task {
|
pub struct Task {
|
||||||
start : NaiveDateTime,
|
start : NaiveDateTime,
|
||||||
end : Option<NaiveDateTime>,
|
end : Option<NaiveDateTime>,
|
||||||
|
|
||||||
project : project::Project,
|
project : project::Project,
|
||||||
description : String
|
description : String
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Error,Debug)]
|
||||||
|
pub enum TaskError {
|
||||||
|
#[error("could not parse date or time of task")]
|
||||||
|
DateTimeParseError,
|
||||||
|
#[error("could not parse task")]
|
||||||
|
GeneralParseError
|
||||||
|
}
|
||||||
|
|
||||||
impl Task {
|
impl Task {
|
||||||
pub fn start(project : project::Project, description : String) -> Task {
|
pub fn start(project : project::Project, description : String) -> Task {
|
||||||
Task {
|
Task {
|
||||||
|
@ -46,7 +56,7 @@ fn escape_special_chars(s: &str) -> String {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FromStr for Task {
|
impl FromStr for Task {
|
||||||
type Err = ();
|
type Err = TaskError;
|
||||||
|
|
||||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
let parts : Vec<String> = split_with_escaped_delimeter(s).collect();
|
let parts : Vec<String> = split_with_escaped_delimeter(s).collect();
|
||||||
|
@ -54,7 +64,7 @@ impl FromStr for Task {
|
||||||
println!("{:?}", parts);
|
println!("{:?}", parts);
|
||||||
|
|
||||||
if parts.len() < 2 {
|
if parts.len() < 2 {
|
||||||
return Err(());
|
return Err(TaskError::GeneralParseError);
|
||||||
}
|
}
|
||||||
|
|
||||||
let time_parts : Vec<&str> = parts[0].split(" - ").collect();
|
let time_parts : Vec<&str> = parts[0].split(" - ").collect();
|
||||||
|
@ -62,7 +72,7 @@ impl FromStr for Task {
|
||||||
let starttime = match NaiveDateTime::parse_from_str(time_parts[0].trim(), conf::FORMAT_DATETIME) {
|
let starttime = match NaiveDateTime::parse_from_str(time_parts[0].trim(), conf::FORMAT_DATETIME) {
|
||||||
Ok(t) => t,
|
Ok(t) => t,
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
return Err(())
|
return Err(TaskError::DateTimeParseError)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -72,7 +82,7 @@ impl FromStr for Task {
|
||||||
endtime = match NaiveDateTime::parse_from_str(time_parts[1].trim(), conf::FORMAT_DATETIME) {
|
endtime = match NaiveDateTime::parse_from_str(time_parts[1].trim(), conf::FORMAT_DATETIME) {
|
||||||
Ok(t) => Some(t),
|
Ok(t) => Some(t),
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
return Err(())
|
return Err(TaskError::DateTimeParseError)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -239,5 +249,13 @@ mod tests {
|
||||||
assert_eq!(t.project.0, t2.project.0);
|
assert_eq!(t.project.0, t2.project.0);
|
||||||
assert_eq!(t.description, t2.description);
|
assert_eq!(t.description, t2.description);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn from_str_errors() {
|
||||||
|
let t = Task::from_str("2021 test project");
|
||||||
|
assert!(matches!(t, Err(TaskError::GeneralParseError)));
|
||||||
|
|
||||||
|
let t = Task::from_str("asb - 2021- | project");
|
||||||
|
assert!(matches!(t, Err(TaskError::DateTimeParseError)));
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue