use crate::identity::{self_canister_id, CanisterId, UserId};
use super::types::*;
const TDS: [u8; 4] = [10, 116, 105, 100];
pub fn parse_token_identifier_with_self_canister(index: ExtTokenIndex) -> ExtTokenIdentifier {
parse_token_identifier(self_canister_id(), index)
}
pub fn parse_token_identifier(canister_id: CanisterId, index: ExtTokenIndex) -> ExtTokenIdentifier {
let mut array = vec![];
array.extend_from_slice(&TDS);
array.extend_from_slice(canister_id.as_slice());
array.extend_from_slice(&index.to_be_bytes());
candid::Principal::try_from_slice(&array).unwrap().to_text() }
pub fn parse_token_index_with_self_canister(
_token_identifier: &ExtTokenIdentifier,
) -> Result<ExtTokenIndex, ExtCommonError> {
parse_token_index(self_canister_id(), _token_identifier)
}
pub fn parse_token_index(
canister_id: CanisterId,
_token_identifier: &ExtTokenIdentifier,
) -> Result<ExtTokenIndex, ExtCommonError> {
let (canister, index) = _parse_token_identifier(_token_identifier);
if &canister[..] != canister_id.as_slice() {
return Err(ExtCommonError::InvalidToken(_token_identifier.to_string()));
}
Ok(index)
}
fn _parse_token_identifier(_token_identifier: &ExtTokenIdentifier) -> (Vec<u8>, ExtTokenIndex) {
let array = UserId::from_text(_token_identifier)
.unwrap()
.as_slice()
.to_vec();
if array.len() <= 4 || &array[0..4] != TDS {
return (array, 0); }
if array.len() <= 8 {
return (array, 0); }
let canister = &array[4..array.len() - 4];
let index = &array[array.len() - 4..array.len()];
let index = (index[0] as u32) << 24
| (index[1] as u32) << 16
| (index[2] as u32) << 8
| (index[3] as u32);
(canister.into(), index)
}