From 67bd2370b260658d16e68c3fbc547938bbc38e6e Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 12 May 2021 01:14:36 +0100 Subject: [PATCH] progress: Make ProgressInfo have Cow Signed-off-by: Ian Jackson --- Cargo.lock | 43 +++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/commands.rs | 2 +- src/packetframe.rs | 4 ++-- src/prelude.rs | 1 + src/progress.rs | 16 ++++++++++++---- 6 files changed, 60 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b047e9bc..a84ba241 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -699,6 +699,16 @@ dependencies = [ "syn 1.0.69", ] +[[package]] +name = "derive-into-owned" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "576fce04d31d592013a5887ba8d9c3830adff329e5096d7e1eb5e8e61262ca62" +dependencies = [ + "quote 0.3.15", + "syn 0.11.11", +] + [[package]] name = "derive_more" version = "0.99.13" @@ -2217,6 +2227,7 @@ dependencies = [ "chrono", "chrono-tz", "delegate", + "derive-into-owned", "digest 0.9.0", "downcast-rs", "either", @@ -2698,6 +2709,12 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +[[package]] +name = "quote" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" + [[package]] name = "quote" version = "0.6.13" @@ -3663,6 +3680,17 @@ dependencies = [ "siphasher 0.2.3", ] +[[package]] +name = "syn" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" +dependencies = [ + "quote 0.3.15", + "synom", + "unicode-xid 0.0.4", +] + [[package]] name = "syn" version = "0.15.44" @@ -3685,6 +3713,15 @@ dependencies = [ "unicode-xid 0.2.1", ] +[[package]] +name = "synom" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" +dependencies = [ + "unicode-xid 0.0.4", +] + [[package]] name = "synstructure" version = "0.12.4" @@ -4212,6 +4249,12 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" +[[package]] +name = "unicode-xid" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" + [[package]] name = "unicode-xid" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 24debfe0..db2d7fb4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,6 +38,7 @@ cast_trait_object="0.1" chrono="0.4" chrono-tz="0.5" delegate="0.5" +derive-into-owned="0.1" digest="0.9" downcast-rs="1" either="1" diff --git a/src/commands.rs b/src/commands.rs index b618ac26..bd95a34e 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -84,7 +84,7 @@ pub struct AccountDetails { #[derive(Debug,Serialize,Deserialize)] pub enum MgmtResponse { Fine, - Progress(ProgressInfo), + Progress(ProgressInfo<'static>), Error { error: MgmtError }, AlterGame { error: Option, responses: Vec }, AccountsList(Vec>), diff --git a/src/packetframe.rs b/src/packetframe.rs index c31cf98e..58e30379 100644 --- a/src/packetframe.rs +++ b/src/packetframe.rs @@ -424,8 +424,8 @@ impl<'c,W:Write> ResponseWriter<'c,W> { #[throws(MgmtChannelWriteError)] - pub fn progress(&mut self, pi: ProgressInfo) { - let resp = crate::commands::MgmtResponse::Progress(pi); + pub fn progress(&mut self, pi: ProgressInfo<'_>) { + let resp = crate::commands::MgmtResponse::Progress(pi.into_owned()); rmp_serde::encode::write_named(&mut self.f, &resp)?; } } diff --git a/src/prelude.rs b/src/prelude.rs index 69accabc..d4164d99 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -55,6 +55,7 @@ pub use boolinator::Boolinator as _; pub use byteorder::{BigEndian, LittleEndian, ReadBytesExt, WriteBytesExt}; pub use cast_trait_object::{dyn_upcast, DynCastExt}; pub use delegate::delegate; +pub use derive_into_owned::IntoOwned; pub use derive_more::*; pub use digest::Digest; pub use downcast_rs::{impl_downcast, Downcast}; diff --git a/src/progress.rs b/src/progress.rs index c51f6fc2..2d1486b3 100644 --- a/src/progress.rs +++ b/src/progress.rs @@ -5,21 +5,29 @@ use crate::prelude::*; use crate::packetframe::ResponseWriter; -#[derive(Debug,Clone,Serialize,Deserialize)] -pub struct ProgressInfo { +#[derive(Debug,Clone,Serialize,Deserialize,IntoOwned)] +pub struct ProgressInfo<'pi> { phase_num: usize, phases: usize, - phase_desc: String, + phase_desc: Cow<'pi, str>, count: usize, of: usize, - desc: String, + desc: Cow<'pi, str>, } pub trait ProgressReporter { + fn report(&mut self, info: ProgressInfo<'_>) + -> Result<(), MgmtChannelWriteError>; } impl ProgressReporter for ResponseWriter<'_, W> where W: Write { + #[throws(MgmtChannelWriteError)] + fn report(&mut self, pi: ProgressInfo<'_>) { + self.progress(pi)? + } } impl ProgressReporter for () { + #[throws(MgmtChannelWriteError)] + fn report(&mut self, _pi: ProgressInfo<'_>) { } } -- 2.30.2