chiark / gitweb /
occregion: json-encode it
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 25 Mar 2021 12:31:38 +0000 (12:31 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 25 Mar 2021 12:41:40 +0000 (12:41 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
daemon/session.rs
src/pcrender.rs
src/updates.rs
src/utils.rs

index 2a9d33c4060f971ab9dab4a3e0131e745fcb5922..a6c7b54a2479c96f1371b031308fdbda5551bc3e 100644 (file)
@@ -49,7 +49,7 @@ struct SessionPieceLoadJson<'r> {
   desc: Html,
   uos: &'r [UoDescription],
   moveable: PieceMoveable,
-  occregion: Option<&'r Region>,
+  occregion: Option<JsonString<&'r Region>>,
 }
 
 #[derive(Serialize,Debug)]
@@ -132,6 +132,8 @@ fn session_inner(form: Json<SessionForm>,
 
       let vangle = pri.angle(gpc).to_compass();
       let (pos, zlevel) = pri.pos_zlevel(gpc);
+      let occregion = gpc.occult.active_region(&ig.gs.occults)?
+        .map(|r| JsonString(r));
 
       let for_info = SessionPieceLoadJson {
         held: &gpc.held,
@@ -142,7 +144,7 @@ fn session_inner(form: Json<SessionForm>,
         desc,
         moveable: gpc.moveable(),
         uos: &pri.ui_operations(&ig.gs, gpc, ipc)?,
-        occregion: gpc.occult.active_region(&ig.gs.occults)?,
+        occregion,
       };
 
       let for_piece = SessionPieceContext {
index 232c39b5959b3887748427737bd3b2f817835211..ce196c2c7c71f5683fd311705f2104e670813296 100644 (file)
@@ -116,6 +116,8 @@ impl PieceRenderInstructions {
                          -> PreparedPieceState {
     let pri = self;
     let (pos, zlevel) = pri.pos_zlevel(gpc);
+    let occregion = gpc.occult.active_region(&gs.occults)?
+      .map(|r| JsonString(r.clone()));
     let r = PreparedPieceState {
       pos        : pos,
       held       : gpc.held,
@@ -126,7 +128,7 @@ impl PieceRenderInstructions {
       pinned     : gpc.pinned,
       uos        : pri.ui_operations(gs, gpc, ipc)?,
       moveable   : gpc.moveable(),
-      occregion  : gpc.occult.active_region(&gs.occults)?.cloned(),
+      occregion,
     };
     dbgc!(pri, ipc, gpc, r);
     r
index d909677b42ae97c89d839fa44364fef91c25a310..7b7cdba804d56d260f04db90215016dceb4b1914 100644 (file)
@@ -107,7 +107,7 @@ pub struct PreparedPieceState {
   pub pinned: bool,
   pub moveable: PieceMoveable,
   pub uos: Vec<UoDescription>,
-  pub occregion: Option<Region>,
+  pub occregion: Option<JsonString<Region>>,
 }
 
 #[derive(Debug,Copy,Clone,Serialize,Deserialize,Eq)]
index afa0120929904525255ee5dbc0be5917bb4d3f3d..4cc9404ae635c70aad60f09d6ffa5f3cfbb9bd57 100644 (file)
@@ -235,6 +235,17 @@ pub fn toml_merge<'u,
   }
 }
 
+#[derive(Debug,Clone)]
+pub struct JsonString<T:Serialize>(pub T);
+impl<T> Serialize for JsonString<T> where T:Serialize {
+  #[throws(S::Error)]
+  fn serialize<S>(&self, s: S) -> S::Ok where S:Serializer {
+    let json = serde_json::to_string(&self.0)
+      .map_err(|e| <S::Error as serde::ser::Error>::custom(e))?;
+    Serialize::serialize(&json, s)?
+  }
+}
+
 #[macro_export]
 macro_rules! deref_to_field {
   {$({ $($gen:tt)* })? $outer:ty, $inner:ty, $($field:tt)*} => {