xref: /DragonOS/kernel/crates/intertrait/tests/on-trait-impl-assoc-type2.rs (revision bd70d2d1f490aabd570a5301b858bd5eb04149fa)
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