1*bd70d2d1SLoGin use std::fmt::Debug;
2*bd70d2d1SLoGin
3*bd70d2d1SLoGin use intertrait::cast::*;
4*bd70d2d1SLoGin use intertrait::*;
5*bd70d2d1SLoGin
6*bd70d2d1SLoGin struct Data;
7*bd70d2d1SLoGin
8*bd70d2d1SLoGin trait Source: CastFrom {}
9*bd70d2d1SLoGin
10*bd70d2d1SLoGin trait Concat {
11*bd70d2d1SLoGin type I1: Debug;
12*bd70d2d1SLoGin type I2: Debug;
13*bd70d2d1SLoGin
concat(&self, a: Self::I1, b: Self::I2) -> String14*bd70d2d1SLoGin fn concat(&self, a: Self::I1, b: Self::I2) -> String;
15*bd70d2d1SLoGin }
16*bd70d2d1SLoGin
17*bd70d2d1SLoGin #[cast_to]
18*bd70d2d1SLoGin impl Concat for Data {
19*bd70d2d1SLoGin type I1 = i32;
20*bd70d2d1SLoGin type I2 = &'static str;
21*bd70d2d1SLoGin
concat(&self, a: Self::I1, b: Self::I2) -> String22*bd70d2d1SLoGin fn concat(&self, a: Self::I1, b: Self::I2) -> String {
23*bd70d2d1SLoGin format!("Data: {} - {}", a, b)
24*bd70d2d1SLoGin }
25*bd70d2d1SLoGin }
26*bd70d2d1SLoGin
27*bd70d2d1SLoGin impl Source for Data {}
28*bd70d2d1SLoGin
29*bd70d2d1SLoGin #[test]
test_cast_to_on_trait_impl_with_assoc_type2()30*bd70d2d1SLoGin fn test_cast_to_on_trait_impl_with_assoc_type2() {
31*bd70d2d1SLoGin let data = Data;
32*bd70d2d1SLoGin let source: &dyn Source = &data;
33*bd70d2d1SLoGin let concat = source.cast::<dyn Concat<I1 = i32, I2 = &'static str>>();
34*bd70d2d1SLoGin assert_eq!(concat.unwrap().concat(101, "hello"), "Data: 101 - hello");
35*bd70d2d1SLoGin }
36