diff --git a/Cargo.lock b/Cargo.lock index 0006f36..ae0544b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -28,9 +28,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.99" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "autocfg" @@ -101,9 +101,9 @@ checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "cc" -version = "1.2.36" +version = "1.2.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5252b3d2648e5eedbc1a6f501e3c795e07025c1e93bbf8bbdd6eef7f447a6d54" +checksum = "80f41ae168f955c12fb8960b057d70d0ca153fb83182b57d86380443527be7e9" dependencies = [ "find-msvc-tools", "shlex", @@ -125,7 +125,7 @@ dependencies = [ "js-sys", "num-traits", "wasm-bindgen", - "windows-link 0.2.0", + "windows-link", ] [[package]] @@ -226,9 +226,9 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "find-msvc-tools" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" +checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" [[package]] name = "fixedbitset" @@ -271,6 +271,12 @@ dependencies = [ "foldhash", ] +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + [[package]] name = "heck" version = "0.5.0" @@ -279,9 +285,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -309,19 +315,19 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "indexmap" -version = "2.11.1" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206a8042aec68fa4a62e8d3f7aa4ceb508177d9324faf261e1959e495b7a1921" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.16.0", ] [[package]] name = "js-sys" -version = "0.3.78" +version = "0.3.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738" +checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" dependencies = [ "once_cell", "wasm-bindgen", @@ -461,7 +467,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54acf3a685220b533e437e264e4d932cfbdc4cc7ec0cd232ed73c08d03b8a7ca" dependencies = [ "fixedbitset", - "hashbrown", + "hashbrown 0.15.5", "indexmap", ] @@ -721,24 +727,33 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.219" +version = "1.0.225" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "fd6c24dee235d0da097043389623fb913daddf92c76e9f5a1db88607a0bcbd1d" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.225" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "659356f9a0cb1e529b24c01e43ad2bdf520ec4ceaf83047b83ddcc2251f96383" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.225" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "0ea936adf78b1f766949a4977b91d2f5595825bd6ec079aa9543ad2685fc4516" dependencies = [ "proc-macro2", "quote", @@ -878,27 +893,27 @@ dependencies = [ [[package]] name = "wasi" -version = "0.14.5+wasi-0.2.4" +version = "0.14.7+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4494f6290a82f5fe584817a676a34b9d6763e8d9d18204009fb31dceca98fd4" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" dependencies = [ "wasip2", ] [[package]] name = "wasip2" -version = "1.0.0+wasi-0.2.4" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03fa2761397e5bd52002cd7e73110c71af2109aca4e521a9f40473fe685b0a24" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.101" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b" +checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" dependencies = [ "cfg-if", "once_cell", @@ -909,9 +924,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.101" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" +checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" dependencies = [ "bumpalo", "log", @@ -923,9 +938,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.101" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d" +checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -933,9 +948,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.101" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa" +checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" dependencies = [ "proc-macro2", "quote", @@ -946,22 +961,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.101" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1" +checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" dependencies = [ "unicode-ident", ] [[package]] name = "windows-core" -version = "0.61.2" +version = "0.62.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" dependencies = [ "windows-implement", "windows-interface", - "windows-link 0.1.3", + "windows-link", "windows-result", "windows-strings", ] @@ -988,12 +1003,6 @@ dependencies = [ "syn", ] -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - [[package]] name = "windows-link" version = "0.2.0" @@ -1002,20 +1011,20 @@ checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" [[package]] name = "windows-result" -version = "0.3.4" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" dependencies = [ - "windows-link 0.1.3", + "windows-link", ] [[package]] name = "windows-strings" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" dependencies = [ - "windows-link 0.1.3", + "windows-link", ] [[package]] @@ -1024,14 +1033,14 @@ version = "0.61.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" dependencies = [ - "windows-link 0.2.0", + "windows-link", ] [[package]] name = "wit-bindgen" -version = "0.45.1" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "zerocopy" diff --git a/Cargo.toml b/Cargo.toml index c7508f5..3f609d0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ repository = "https://github.com/krahos/planter-core" path = "src/lib.rs" [dependencies] -anyhow = "1.0.99" +anyhow = "1.0.100" chrono = "0.4.42" once_cell = "1.21.3" daggy = "0.9.0" diff --git a/flake.lock b/flake.lock index 0f51412..46ff368 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1757068644, - "narHash": "sha256-NOrUtIhTkIIumj1E/Rsv1J37Yi3xGStISEo8tZm3KW4=", + "lastModified": 1758277210, + "narHash": "sha256-iCGWf/LTy+aY0zFu8q12lK8KuZp7yvdhStehhyX1v8w=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "8eb28adfa3dc4de28e792e3bf49fcf9007ca8ac9", + "rev": "8eaee110344796db060382e15d3af0a9fc396e0e", "type": "github" }, "original": { @@ -62,11 +62,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1757212513, - "narHash": "sha256-ZTHwY7u8BQF1JUazhGk+ftCjsS57Ht6KSnnkxQoUBA8=", + "lastModified": 1758335443, + "narHash": "sha256-2jaGMj32IckpZgBjn7kG4zyJl66T+2A1Fn2ppkHh91o=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "a8c2f9348abb14647d8a4899d1b3acd0155ce2cd", + "rev": "f1ccb14649cf87e48051a6ac3a571b4a57d84ff3", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 547019e..844aab8 100644 --- a/flake.nix +++ b/flake.nix @@ -20,7 +20,6 @@ devShells.default = mkShell { buildInputs = [ bacon - cargo-udeps cargo-edit rust-analyzer cargo-deny diff --git a/src/task.rs b/src/task.rs index 5aa3e6b..cd374a7 100644 --- a/src/task.rs +++ b/src/task.rs @@ -1,4 +1,5 @@ use crate::{duration::PositiveDuration, resources::Resource}; +use anyhow::Context; use chrono::{DateTime, Utc}; #[derive(Debug, Clone, Default, PartialEq, Eq)] @@ -61,9 +62,10 @@ impl Task { /// /// * `start` - The new start time of the task. /// - /// # Panics + /// # Errors /// - /// Panics if start and end times are too far apart see [`duration`] for details. + /// Returns an error if the task has a finish date and the start date passed + /// as parameter is too far from that. /// /// # Example /// @@ -77,7 +79,7 @@ impl Task { /// assert_eq!(task.start().unwrap(), start_time); /// ``` #[allow(clippy::expect_used)] - pub fn edit_start(&mut self, start: DateTime) { + pub fn edit_start(&mut self, start: DateTime) -> anyhow::Result<()> { self.start = Some(start); if let Some(duration) = self.duration { @@ -93,10 +95,11 @@ impl Task { self.duration = Some( duration .try_into() - .expect("Start time and end time were too far apart"), + .context("Start time and finish time were too far apart")?, ); } } + Ok(()) } /// Returns the start time of the task. It's None by default. @@ -126,9 +129,11 @@ impl Task { /// /// * `finish` - The new finish time of the task. /// - /// # Panics + /// # Errors + /// + /// Returns an error if the task has a start date and the finish date passed + /// as parameter is too far from that. /// - /// Panics if start and end times are too far apart see [`duration`] for details. /// /// # Example /// @@ -140,11 +145,11 @@ impl Task { /// assert!(task.start().is_none()); /// /// let mut finish_time = Utc::now(); - /// task.edit_finish(finish_time); + /// task.edit_finish(finish_time).unwrap(); /// assert_eq!(task.finish().unwrap(), finish_time); /// ``` #[allow(clippy::expect_used)] - pub fn edit_finish(&mut self, finish: DateTime) { + pub fn edit_finish(&mut self, finish: DateTime) -> anyhow::Result<()> { self.finish = Some(finish); if let Some(start) = self.start() { @@ -158,9 +163,10 @@ impl Task { self.duration = Some( duration .try_into() - .expect("Start time and end time were too far apart"), + .context("Start time and finish time were too far apart")?, ); } + Ok(()) } /// Returns the finish time of the task. It's None by default. @@ -399,8 +405,8 @@ mod tests { let finish = start + Duration::milliseconds(milliseconds); let mut task = Task::new("World domination"); - task.edit_start(start); - task.edit_finish(finish); + task.edit_start(start).unwrap(); + task.edit_finish(finish).unwrap(); assert!(task.duration().unwrap() == Duration::milliseconds(milliseconds).try_into().unwrap()); } @@ -420,7 +426,7 @@ mod tests { let start = Utc::now(); let mut task = Task::new("World domination"); - task.edit_start(start); + task.edit_start(start).unwrap(); let duration = Duration::milliseconds(milliseconds).try_into().unwrap(); task.edit_duration(duration); assert!(task.finish().unwrap() == start + *duration); @@ -432,24 +438,49 @@ mod tests { let finish = start + Duration::milliseconds(milliseconds); let mut task = Task::new("World domination"); - task.edit_start(start); - task.edit_finish(finish); + task.edit_start(start).unwrap(); + task.edit_finish(finish).unwrap(); let duration = Duration::milliseconds(milliseconds + 1).try_into().unwrap(); task.edit_duration(duration); assert!(task.finish().unwrap() == start + *duration); } + #[test] - fn start_time_is_properly_pushed_back_when_adding_earlier_end_time(milliseconds in 0..MAX_DURATION) { + fn start_time_is_properly_pushed_back_when_adding_earlier_finish_time(milliseconds in 0..MAX_DURATION) { let start = Utc::now(); let finish = start - Duration::milliseconds(milliseconds); let mut task = Task::new("World domination"); - task.edit_start(start); - task.edit_finish(finish); + task.edit_start(start).unwrap(); + task.edit_finish(finish).unwrap(); assert!(task.start().unwrap() == task.finish().unwrap()); } } + + #[test] + fn edit_start_returns_error_when_too_far_apart() { + let milliseconds = MAX_DURATION + 1; + let finish = Utc::now(); + let start = finish - Duration::milliseconds(milliseconds); + let mut task = Task::new("World domination"); + + task.edit_finish(finish).unwrap(); + + assert!(task.edit_start(start).is_err()); + } + + #[test] + fn edit_finish_returns_error_when_too_far_apart() { + let milliseconds = MAX_DURATION + 1; + let start = Utc::now(); + let finish = start + Duration::milliseconds(milliseconds); + let mut task = Task::new("World domination"); + + task.edit_start(start).unwrap(); + + assert!(task.edit_finish(finish).is_err()); + } }