Integrate release recovery, semantic review, coverage and Windows packaging
This commit is contained in:
@@ -5,7 +5,7 @@ use super::*;
|
||||
use iced::widget::{Column, column, text_input};
|
||||
use std::{cell::RefCell, collections::BTreeSet};
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
|
||||
pub enum Tool {
|
||||
Lifeline,
|
||||
Message,
|
||||
@@ -26,7 +26,7 @@ impl Tool {
|
||||
}
|
||||
}
|
||||
}
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
|
||||
pub enum MessageStyle {
|
||||
Asynchronous,
|
||||
Call,
|
||||
@@ -160,7 +160,8 @@ struct CallChoiceContext {
|
||||
before: Option<Id>,
|
||||
endpoints: Option<(Option<Id>, Option<Id>)>,
|
||||
}
|
||||
#[derive(Clone)]
|
||||
#[derive(Clone, serde::Serialize, serde::Deserialize)]
|
||||
#[serde(deny_unknown_fields)]
|
||||
struct Draft {
|
||||
owner: Id,
|
||||
parent: Id,
|
||||
@@ -178,8 +179,11 @@ struct Draft {
|
||||
second_guard: String,
|
||||
operator: FragmentOperator,
|
||||
bindings: BTreeMap<Id, Id>,
|
||||
#[serde(with = "recovery_values")]
|
||||
values: BTreeMap<crate::data_values::FieldPathKey, String>,
|
||||
#[serde(with = "recovery_field_key")]
|
||||
value_focus: Option<crate::data_values::FieldPathKey>,
|
||||
#[serde(with = "recovery_field_key")]
|
||||
value_browse: Option<crate::data_values::FieldPathKey>,
|
||||
value_browse_page: usize,
|
||||
value_authored_page: usize,
|
||||
@@ -187,6 +191,22 @@ struct Draft {
|
||||
choice_page: usize,
|
||||
}
|
||||
impl State {
|
||||
pub(super) fn recovery_snapshot(&self) -> Result<Option<serde_json::Value>, String> {
|
||||
self.draft
|
||||
.as_ref()
|
||||
.map(serde_json::to_value)
|
||||
.transpose()
|
||||
.map_err(|e| e.to_string())
|
||||
}
|
||||
|
||||
pub(super) fn from_recovery(value: serde_json::Value) -> Result<Self, String> {
|
||||
let draft = serde_json::from_value(value).map_err(|e| e.to_string())?;
|
||||
Ok(Self {
|
||||
draft: Some(draft),
|
||||
..Default::default()
|
||||
})
|
||||
}
|
||||
|
||||
pub(crate) fn scrolled(&mut self, area: ScrollArea, offset: iced::Vector) -> bool {
|
||||
let index = match area {
|
||||
ScrollArea::Canvas => 0,
|
||||
@@ -436,6 +456,57 @@ impl State {
|
||||
Ok(None)
|
||||
}
|
||||
}
|
||||
|
||||
mod recovery_values {
|
||||
use super::*;
|
||||
use serde::{Deserialize, Serialize};
|
||||
pub fn serialize<S: serde::Serializer>(
|
||||
values: &BTreeMap<crate::data_values::FieldPathKey, String>,
|
||||
serializer: S,
|
||||
) -> Result<S::Ok, S::Error> {
|
||||
values
|
||||
.iter()
|
||||
.map(|(key, value)| (&key.path, key.field, value))
|
||||
.collect::<Vec<_>>()
|
||||
.serialize(serializer)
|
||||
}
|
||||
pub fn deserialize<'de, D: serde::Deserializer<'de>>(
|
||||
deserializer: D,
|
||||
) -> Result<BTreeMap<crate::data_values::FieldPathKey, String>, D::Error> {
|
||||
let values = Vec::<(Vec<Id>, Id, String)>::deserialize(deserializer)?;
|
||||
let mut result = BTreeMap::new();
|
||||
for (path, field, value) in values {
|
||||
if result
|
||||
.insert(crate::data_values::FieldPathKey { path, field }, value)
|
||||
.is_some()
|
||||
{
|
||||
return Err(serde::de::Error::custom(
|
||||
"Duplicate recovered scenario value path",
|
||||
));
|
||||
}
|
||||
}
|
||||
Ok(result)
|
||||
}
|
||||
}
|
||||
|
||||
mod recovery_field_key {
|
||||
use super::*;
|
||||
use serde::{Deserialize, Serialize};
|
||||
pub fn serialize<S: serde::Serializer>(
|
||||
key: &Option<crate::data_values::FieldPathKey>,
|
||||
serializer: S,
|
||||
) -> Result<S::Ok, S::Error> {
|
||||
key.as_ref()
|
||||
.map(|key| (&key.path, key.field))
|
||||
.serialize(serializer)
|
||||
}
|
||||
pub fn deserialize<'de, D: serde::Deserializer<'de>>(
|
||||
deserializer: D,
|
||||
) -> Result<Option<crate::data_values::FieldPathKey>, D::Error> {
|
||||
Ok(Option::<(Vec<Id>, Id)>::deserialize(deserializer)?
|
||||
.map(|(path, field)| crate::data_values::FieldPathKey { path, field }))
|
||||
}
|
||||
}
|
||||
fn viewpoint(p: &Project, owner: Id) -> ScenarioViewpoint {
|
||||
match p.elements.get(&owner).and_then(|e| e.shared()) {
|
||||
Some(SharedBody::Scenario { viewpoint, .. }) => *viewpoint,
|
||||
|
||||
Reference in New Issue
Block a user