mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 22:11:02 +00:00
Add starts_with to v0 and v1 MultiLocation (#6311)
* add `starts_with` to v0 and v1 MultiLocation * add tests * fmt
This commit is contained in:
@@ -356,17 +356,30 @@ impl MultiLocation {
|
|||||||
/// # }
|
/// # }
|
||||||
/// ```
|
/// ```
|
||||||
pub fn match_and_split(&self, prefix: &MultiLocation) -> Option<&Junction> {
|
pub fn match_and_split(&self, prefix: &MultiLocation) -> Option<&Junction> {
|
||||||
if prefix.len() + 1 != self.len() {
|
if prefix.len() + 1 != self.len() || !self.starts_with(prefix) {
|
||||||
return None
|
return None
|
||||||
}
|
}
|
||||||
for i in 0..prefix.len() {
|
|
||||||
if prefix.at(i) != self.at(i) {
|
|
||||||
return None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return self.at(prefix.len())
|
return self.at(prefix.len())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns whether `self` begins with or is equal to `prefix`.
|
||||||
|
///
|
||||||
|
/// # Example
|
||||||
|
/// ```rust
|
||||||
|
/// # use xcm::v0::{Junction::*, MultiLocation::*};
|
||||||
|
/// let m = X4(Parent, PalletInstance(3), OnlyChild, OnlyChild);
|
||||||
|
/// assert!(m.starts_with(&X2(Parent, PalletInstance(3))));
|
||||||
|
/// assert!(m.starts_with(&m));
|
||||||
|
/// assert!(!m.starts_with(&X2(Parent, GeneralIndex(99))));
|
||||||
|
/// assert!(!m.starts_with(&X1(PalletInstance(3))));
|
||||||
|
/// ```
|
||||||
|
pub fn starts_with(&self, prefix: &MultiLocation) -> bool {
|
||||||
|
if self.len() < prefix.len() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
prefix.iter().zip(self.iter()).all(|(l, r)| l == r)
|
||||||
|
}
|
||||||
|
|
||||||
/// Mutates `self`, suffixing it with `new`. Returns `Err` in case of overflow.
|
/// Mutates `self`, suffixing it with `new`. Returns `Err` in case of overflow.
|
||||||
pub fn push(&mut self, new: Junction) -> result::Result<(), ()> {
|
pub fn push(&mut self, new: Junction) -> result::Result<(), ()> {
|
||||||
let mut n = MultiLocation::Null;
|
let mut n = MultiLocation::Null;
|
||||||
@@ -601,6 +614,24 @@ mod tests {
|
|||||||
assert_eq!(m.match_and_split(&m), None);
|
assert_eq!(m.match_and_split(&m), None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn starts_with_works() {
|
||||||
|
let full = X3(Parent, Parachain(1000), AccountIndex64 { network: Any, index: 23 });
|
||||||
|
let identity = full.clone();
|
||||||
|
let prefix = X2(Parent, Parachain(1000));
|
||||||
|
let wrong_parachain = X2(Parent, Parachain(1001));
|
||||||
|
let wrong_account = X3(Parent, Parachain(1000), AccountIndex64 { network: Any, index: 24 });
|
||||||
|
let no_parents = X1(Parachain(1000));
|
||||||
|
let too_many_parents = X3(Parent, Parent, Parachain(1000));
|
||||||
|
|
||||||
|
assert!(full.starts_with(&identity));
|
||||||
|
assert!(full.starts_with(&prefix));
|
||||||
|
assert!(!full.starts_with(&wrong_parachain));
|
||||||
|
assert!(!full.starts_with(&wrong_account));
|
||||||
|
assert!(!full.starts_with(&no_parents));
|
||||||
|
assert!(!full.starts_with(&too_many_parents));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn append_with_works() {
|
fn append_with_works() {
|
||||||
let acc = AccountIndex64 { network: Any, index: 23 };
|
let acc = AccountIndex64 { network: Any, index: 23 };
|
||||||
|
|||||||
@@ -253,6 +253,24 @@ impl MultiLocation {
|
|||||||
self.interior.match_and_split(&prefix.interior)
|
self.interior.match_and_split(&prefix.interior)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns whether `self` has the same number of parents as `prefix` and its junctions begins
|
||||||
|
/// with the junctions of `prefix`.
|
||||||
|
///
|
||||||
|
/// # Example
|
||||||
|
/// ```rust
|
||||||
|
/// # use xcm::v1::{Junctions::*, Junction::*, MultiLocation};
|
||||||
|
/// let m = MultiLocation::new(1, X3(PalletInstance(3), OnlyChild, OnlyChild));
|
||||||
|
/// assert!(m.starts_with(&MultiLocation::new(1, X1(PalletInstance(3)))));
|
||||||
|
/// assert!(!m.starts_with(&MultiLocation::new(1, X1(GeneralIndex(99)))));
|
||||||
|
/// assert!(!m.starts_with(&MultiLocation::new(0, X1(PalletInstance(3)))));
|
||||||
|
/// ```
|
||||||
|
pub fn starts_with(&self, prefix: &MultiLocation) -> bool {
|
||||||
|
if self.parents != prefix.parents {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
self.interior.starts_with(&prefix.interior)
|
||||||
|
}
|
||||||
|
|
||||||
/// Mutate `self` so that it is suffixed with `suffix`.
|
/// Mutate `self` so that it is suffixed with `suffix`.
|
||||||
///
|
///
|
||||||
/// Does not modify `self` and returns `Err` with `suffix` in case of overflow.
|
/// Does not modify `self` and returns `Err` with `suffix` in case of overflow.
|
||||||
@@ -801,15 +819,29 @@ impl Junctions {
|
|||||||
/// # }
|
/// # }
|
||||||
/// ```
|
/// ```
|
||||||
pub fn match_and_split(&self, prefix: &Junctions) -> Option<&Junction> {
|
pub fn match_and_split(&self, prefix: &Junctions) -> Option<&Junction> {
|
||||||
if prefix.len() + 1 != self.len() {
|
if prefix.len() + 1 != self.len() || !self.starts_with(prefix) {
|
||||||
return None
|
return None
|
||||||
}
|
}
|
||||||
for i in 0..prefix.len() {
|
self.at(prefix.len())
|
||||||
if prefix.at(i) != self.at(i) {
|
}
|
||||||
return None
|
|
||||||
}
|
/// Returns whether `self` begins with or is equal to `prefix`.
|
||||||
|
///
|
||||||
|
/// # Example
|
||||||
|
/// ```rust
|
||||||
|
/// # use xcm::v1::{Junctions::*, Junction::*};
|
||||||
|
/// let mut j = X3(Parachain(2), PalletInstance(3), OnlyChild);
|
||||||
|
/// assert!(j.starts_with(&X2(Parachain(2), PalletInstance(3))));
|
||||||
|
/// assert!(j.starts_with(&j));
|
||||||
|
/// assert!(j.starts_with(&X1(Parachain(2))));
|
||||||
|
/// assert!(!j.starts_with(&X1(Parachain(999))));
|
||||||
|
/// assert!(!j.starts_with(&X4(Parachain(2), PalletInstance(3), OnlyChild, OnlyChild)));
|
||||||
|
/// ```
|
||||||
|
pub fn starts_with(&self, prefix: &Junctions) -> bool {
|
||||||
|
if self.len() < prefix.len() {
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
return self.at(prefix.len())
|
prefix.iter().zip(self.iter()).all(|(l, r)| l == r)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -929,6 +961,26 @@ mod tests {
|
|||||||
assert_eq!(m.match_and_split(&m), None);
|
assert_eq!(m.match_and_split(&m), None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn starts_with_works() {
|
||||||
|
let full: MultiLocation =
|
||||||
|
(Parent, Parachain(1000), AccountId32 { network: Any, id: [0; 32] }).into();
|
||||||
|
let identity: MultiLocation = full.clone();
|
||||||
|
let prefix: MultiLocation = (Parent, Parachain(1000)).into();
|
||||||
|
let wrong_parachain: MultiLocation = (Parent, Parachain(1001)).into();
|
||||||
|
let wrong_account: MultiLocation =
|
||||||
|
(Parent, Parachain(1000), AccountId32 { network: Any, id: [1; 32] }).into();
|
||||||
|
let no_parents: MultiLocation = (Parachain(1000)).into();
|
||||||
|
let too_many_parents: MultiLocation = (Parent, Parent, Parachain(1000)).into();
|
||||||
|
|
||||||
|
assert!(full.starts_with(&identity));
|
||||||
|
assert!(full.starts_with(&prefix));
|
||||||
|
assert!(!full.starts_with(&wrong_parachain));
|
||||||
|
assert!(!full.starts_with(&wrong_account));
|
||||||
|
assert!(!full.starts_with(&no_parents));
|
||||||
|
assert!(!full.starts_with(&too_many_parents));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn append_with_works() {
|
fn append_with_works() {
|
||||||
let acc = AccountIndex64 { network: Any, index: 23 };
|
let acc = AccountIndex64 { network: Any, index: 23 };
|
||||||
|
|||||||
Reference in New Issue
Block a user