chiark / gitweb /
progress: Make ProgressInfo have Cow
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 12 May 2021 00:14:36 +0000 (01:14 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 12 May 2021 00:14:36 +0000 (01:14 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Cargo.lock
Cargo.toml
src/commands.rs
src/packetframe.rs
src/prelude.rs
src/progress.rs

index b047e9bc22f6be33cf1587806aa1b01df39e17d2..a84ba241be3adfb94e5ad1639721b3fa06ef0075 100644 (file)
@@ -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"
index 24debfe039b8618971ecb8c9ec7b1503ec313cfe..db2d7fb4da072b1e7b92a00ad8124b16b9b3f2d7 100644 (file)
@@ -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"
index b618ac2663a8f1508e709400b747b1c8b9e5bd07..bd95a34e06ec4df8ea06e950a4c0b6a3d41acd71 100644 (file)
@@ -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<MgmtError>, responses: Vec<MgmtGameResponse> },
   AccountsList(Vec<Arc<AccountName>>),
index c31cf98e340cdb7cf1fa0e3dd07fa4a91ec8bfd7..58e303795e84817ba588b560d9f73de8d575bfe9 100644 (file)
@@ -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)?;
   }
 }
index 69accabcdb8be8e92e8d806c7fe6ecc146c6ce85..d4164d992afdf2ad159bd4168565dfeb810a7221 100644 (file)
@@ -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};
index c51f6fc2841c0b92901b3b5a22b20f8a1ebad0f3..2d1486b3ce84dd523f52aff32248383f0051d18d 100644 (file)
@@ -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<W> 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<'_>) { }
 }