wasm_utils/note/versioning/
v1.rs1use crate::note::*;
2use crate::types::{OpStatusCode, OperationError};
3
4pub fn note_from_str(s: &str) -> Result<JsNote, OperationError> {
5 let scheme_and_parts: Vec<&str> = s.split("://").collect();
6 let scheme = scheme_and_parts[0];
7
8 let parts: Vec<&str> = scheme_and_parts[1].split('/').collect();
9 if parts.len() < 5 {
10 return Err(OperationError::new_with_message(
11 OpStatusCode::InvalidNoteLength,
12 format!("Note length has incorrect parts length: {}", parts.len()),
13 ));
14 }
15 let authority = parts[0];
17 let chain_ids = parts[1];
18 let chain_identifying_data = parts[2];
19 let secrets = parts[3];
20 let misc = parts[4].replace('?', "");
21
22 let authority_parts: Vec<&str> = authority.split(':').collect();
24 if authority_parts.len() != 2 {
25 return Err(OperationError::new_with_message(
26 OpStatusCode::InvalidNoteLength,
27 format!("Invalid authority parts length: {}", authority_parts.len()),
28 ));
29 }
30
31 let version = NoteVersion::from_str(authority_parts[0])?;
32 let protocol = NoteProtocol::from_str(authority_parts[1])?;
33
34 let chain_ids_parts: Vec<&str> = chain_ids.split(':').collect();
36 if chain_ids_parts.len() != 2 {
37 return Err(OperationError::new_with_message(
38 OpStatusCode::InvalidNoteLength,
39 format!("Invalid chain IDs parts length: {}", chain_ids_parts.len()),
40 ));
41 }
42 let source_chain_id = chain_ids_parts[0];
43 let _: u64 = source_chain_id.parse().map_err(|_| OpStatusCode::InvalidSourceChain)?;
44 let target_chain_id = chain_ids_parts[1];
45 let _: u64 = target_chain_id.parse().map_err(|_| OpStatusCode::InvalidTargetChain)?;
46
47 let chain_identifying_data_parts: Vec<&str> = chain_identifying_data.split(':').collect();
49 if chain_identifying_data_parts.len() != 2 {
50 return Err(OperationError::new_with_message(
51 OpStatusCode::InvalidNoteLength,
52 format!(
53 "Invalid chain identifying data parts length: {}",
54 chain_identifying_data_parts.len()
55 ),
56 ));
57 }
58 let source_identifying_data = chain_identifying_data_parts[0];
59 let target_identifying_data = chain_identifying_data_parts[1];
60
61 let misc_parts: Vec<&str> = misc.split('&').collect();
63 let mut curve = None;
64 let mut width = None;
65 let mut exponentiation = None;
66 let mut hash_function = None;
67 let mut backend = None;
68 let mut token_symbol = None;
69 let mut denomination = None;
70 let mut amount = None;
71 let mut index = None;
72
73 for part in misc_parts {
74 let part_parts: Vec<&str> = part.split('=').collect();
75 if part_parts.len() != 2 {
76 return Err(OperationError::new_with_message(
77 OpStatusCode::InvalidNoteMiscData,
78 format!("Invalid note misc data parts length: {}", part_parts.len()),
79 ));
80 }
81 let key = part_parts[0];
82 let value = part_parts[1];
83 println!("{}={}", key, value);
84 match key {
85 "curve" => curve = Some(value),
86 "width" => width = Some(value),
87 "exp" => exponentiation = Some(value),
88 "hf" => hash_function = Some(value),
89 "backend" => backend = Some(value),
90 "token" => token_symbol = Some(value),
91 "denom" => denomination = Some(value),
92 "amount" => amount = Some(value),
93 "index" => index = Some(value),
94 _ => {
95 return Err(OperationError::new_with_message(
96 OpStatusCode::InvalidNoteMiscData,
97 format!("Unknown miscellaneous key: {}", key),
98 ))
99 }
100 }
101 }
102
103 let secret_parts: Vec<Vec<u8>> = secrets
104 .split(':')
105 .map(|v| hex::decode(v).unwrap_or_default())
106 .collect::<Vec<Vec<u8>>>();
107
108 Ok(JsNote {
109 scheme: scheme.to_string(),
110 protocol,
111 version,
112 target_chain_id: target_chain_id.to_string(),
113 source_chain_id: source_chain_id.to_string(),
114 source_identifying_data: source_identifying_data.to_string(),
115 target_identifying_data: target_identifying_data.to_string(),
116 token_symbol: token_symbol.map(|v| v.to_string()),
117 curve: curve.map(|v| v.parse::<Curve>().unwrap()),
118 hash_function: hash_function.map(|v| HashFunction::from_str(v).unwrap()),
119 backend: backend.map(|b| b.parse().unwrap()),
120 denomination: denomination.map(|v| v.parse::<u8>().unwrap()),
121 amount: amount.map(|v| v.parse::<String>().unwrap()),
122 exponentiation: exponentiation.map(|v| v.parse::<i8>().unwrap()),
123 width: width.map(|v| v.parse::<usize>().unwrap()),
124 secrets: secret_parts,
125 index: index.map(|v| v.parse().unwrap()),
126 })
127}