minimal example

This commit is contained in:
qwjyh 2025-01-28 02:53:06 +09:00
commit fc257be1a4
4 changed files with 85 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/target

7
Cargo.lock generated Normal file
View file

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "test-types"
version = "0.1.0"

6
Cargo.toml Normal file
View file

@ -0,0 +1,6 @@
[package]
name = "test-types"
version = "0.1.0"
edition = "2021"
[dependencies]

71
src/main.rs Normal file
View file

@ -0,0 +1,71 @@
use std::{fmt::Debug, num::ParseIntError};
trait MyTrait {
type Ux: Copy;
type T: Copy + TryFrom<Self::Ux> + Into<Self::Ux> + Debug;
fn val(&self) -> Self::Ux;
fn converted(&self) -> Self::T
where
<<Self as MyTrait>::T as std::convert::TryFrom<<Self as MyTrait>::Ux>>::Error:
std::fmt::Debug,
{
self.val().try_into().unwrap()
}
}
struct MyType1 {}
impl MyTrait for MyType1 {
type Ux = u32;
type T = u32;
fn val(&self) -> Self::Ux {
10
}
}
struct MyType2 {}
#[derive(Debug, Clone, Copy)]
enum MyType2Val {
A = 0x1,
B = 0x2,
}
impl Into<u32> for MyType2Val {
fn into(self) -> u32 {
self as _
}
}
impl TryFrom<u32> for MyType2Val {
type Error = ParseIntError;
fn try_from(value: u32) -> Result<Self, Self::Error> {
match value {
0x1 => Ok(MyType2Val::A),
0x2 => Ok(MyType2Val::B),
_ => panic!()
}
}
}
impl MyTrait for MyType2 {
type Ux = u32;
type T = MyType2Val;
fn val(&self) -> Self::Ux {
todo!()
}
}
fn main() {
println!("Hello, world!");
let x = MyType1 {};
println!("{}", x.converted());
}