wasm_utils/note/versioning/
v1.rs

1use 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	// Raw parts
16	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	// Authority parsing
23	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	// Chain IDs parsing
35	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	// Chain Identifying Data parsing
48	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	// Misc data parsing
62	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}