Skip to content

Commit

Permalink
Merge pull request #1357 from rainlanguage/2025-02-19-state-managemen…
Browse files Browse the repository at this point in the history
…t-improvements

Remove duplicate code in state management
  • Loading branch information
hardyjosh authored Feb 20, 2025
2 parents 7ddeee5 + ac11ea0 commit b496732
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 65 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions crates/js_api/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,4 @@ base64 = "0.22.1"
bincode = "1.3.3"
sha2 = "0.10.8"
web-sys = { version = "0.3.69", features = ["console"] }
strict-yaml-rust = { workspace = true }
134 changes: 69 additions & 65 deletions crates/js_api/src/gui/state_management.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
use super::*;
use rain_orderbook_app_settings::token::Token;
use sha2::{Digest, Sha256};
use std::sync::{Arc, RwLock};
use strict_yaml_rust::StrictYaml;

#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
struct SerializedGuiState {
Expand All @@ -20,6 +22,54 @@ impl DotrainOrderGui {
Ok(URL_SAFE.encode(hash))
}

fn create_preset(value: &field_values::PairValue, default_value: String) -> GuiPreset {
if value.is_preset {
GuiPreset {
id: value.value.clone(),
name: None,
value: default_value,
}
} else {
GuiPreset {
id: "".to_string(),
name: None,
value: value.value.clone(),
}
}
}

fn preset_to_pair_value(preset: GuiPreset) -> field_values::PairValue {
if preset.id != "" {
field_values::PairValue {
is_preset: true,
value: preset.id,
}
} else {
field_values::PairValue {
is_preset: false,
value: preset.value,
}
}
}

fn parse_vault_ids_for_order(
documents: Vec<Arc<RwLock<StrictYaml>>>,
order_key: &str,
is_input: bool,
) -> Result<BTreeMap<(bool, u8), Option<String>>, GuiError> {
let mut vault_ids = BTreeMap::new();
for (i, vault_id) in Order::parse_vault_ids(documents, order_key, is_input)?
.iter()
.enumerate()
{
vault_ids.insert(
(is_input, i as u8),
vault_id.as_ref().map(|v| v.to_string()),
);
}
Ok(vault_ids)
}

#[wasm_bindgen(js_name = "serializeState")]
pub fn serialize_state(&self) -> Result<String, GuiError> {
let mut field_values = BTreeMap::new();
Expand All @@ -37,30 +87,14 @@ impl DotrainOrderGui {
.ok_or(GuiError::InvalidPreset)?
.clone()
} else {
GuiPreset {
id: "".to_string(),
name: None,
value: v.value.clone(),
}
Self::create_preset(v, String::default())
};
field_values.insert(k.clone(), preset);
}

let mut deposits = BTreeMap::new();
for (k, v) in self.deposits.iter() {
let preset = if v.is_preset {
GuiPreset {
id: v.value.clone(),
name: None,
value: String::default(),
}
} else {
GuiPreset {
id: "".to_string(),
name: None,
value: v.value.clone(),
}
};
let preset = Self::create_preset(v, String::default());
deposits.insert(k.clone(), preset);
}

Expand All @@ -81,30 +115,20 @@ impl DotrainOrderGui {
}

let order_key = Deployment::parse_order_key(
self.dotrain_order.dotrain_yaml().documents,
self.dotrain_order.dotrain_yaml().documents.clone(),
&self.selected_deployment,
)?;
let mut vault_ids = BTreeMap::new();
for (i, vault_id) in Order::parse_vault_ids(
vault_ids.extend(Self::parse_vault_ids_for_order(
self.dotrain_order.dotrain_yaml().documents.clone(),
&order_key,
true,
)?
.iter()
.enumerate()
{
vault_ids.insert((true, i as u8), vault_id.as_ref().map(|v| v.to_string()));
}
for (i, vault_id) in Order::parse_vault_ids(
)?);
vault_ids.extend(Self::parse_vault_ids_for_order(
self.dotrain_order.dotrain_yaml().documents.clone(),
&order_key,
false,
)?
.iter()
.enumerate()
{
vault_ids.insert((false, i as u8), vault_id.as_ref().map(|v| v.to_string()));
}
)?);

let state = SerializedGuiState {
field_values: field_values.clone(),
Expand Down Expand Up @@ -145,39 +169,13 @@ impl DotrainOrderGui {
let field_values = state
.field_values
.into_iter()
.map(|(k, v)| {
let pair_value = if v.id != "" {
field_values::PairValue {
is_preset: true,
value: v.id,
}
} else {
field_values::PairValue {
is_preset: false,
value: v.value,
}
};
(k, pair_value)
})
.map(|(k, v)| (k, Self::preset_to_pair_value(v)))
.collect::<BTreeMap<_, _>>();

let deposits = state
.deposits
.into_iter()
.map(|(k, v)| {
let pair_value = if v.id != "" {
field_values::PairValue {
is_preset: true,
value: v.id,
}
} else {
field_values::PairValue {
is_preset: false,
value: v.value,
}
};
(k, pair_value)
})
.map(|(k, v)| (k, Self::preset_to_pair_value(v)))
.collect::<BTreeMap<_, _>>();

let dotrain_order_gui = DotrainOrderGui {
Expand Down Expand Up @@ -236,15 +234,21 @@ impl DotrainOrderGui {
self.deposits.clear();
}

fn is_preset<K: AsRef<str>>(
&self,
key: K,
map: &BTreeMap<String, field_values::PairValue>,
) -> Option<bool> {
map.get(key.as_ref()).map(|v| v.is_preset)
}

#[wasm_bindgen(js_name = "isFieldPreset")]
pub fn is_field_preset(&self, binding: String) -> Option<bool> {
let value = self.field_values.get(&binding);
value.map(|v| v.is_preset)
self.is_preset(binding, &self.field_values)
}

#[wasm_bindgen(js_name = "isDepositPreset")]
pub fn is_deposit_preset(&self, token: String) -> Option<bool> {
let value = self.deposits.get(&token);
value.map(|v| v.is_preset)
self.is_preset(token, &self.deposits)
}
}

0 comments on commit b496732

Please sign in to comment.