1pub mod slang;
2pub mod traits;
3pub use traits::*;
4
5#[cfg(feature="vulkan")]
6pub mod vulkan;
7#[cfg(feature="directx")]
8pub mod directx;
9
10pub use anyhow::{Result, Error};
11pub use glam::*;
12
13use paste::paste;
14
15#[cfg(feature="vulkan")]
16pub struct Vulkan;
17#[cfg(feature="directx")]
18pub struct Directx;
19
20macro_rules! create_primitive {
21 ($name:ident) => {
22 paste! {
23 pub trait [<$name Primitive>]<T>
24 where Self::Inner: [<I $name>]<T>, T: CobraType<T> {
25 type Inner;
26 }
27
28 #[cfg(feature="vulkan")]
29 impl [<$name Primitive>]<Vulkan> for Vulkan { type Inner = vulkan::mappings::[<$name Vulkan>]; }
30 #[cfg(feature="directx")]
31 impl [<$name Primitive>]<Directx> for Directx { type Inner = directx::mappings::[<$name Directx>]; }
32 pub type $name<T> = <T as [<$name Primitive>]<T>>::Inner;
33 }
34 };
35}
36
37pub trait CobraType<T>: CobraPrimitive<T> +
38 BufferPrimitive<T> + ImagePrimitive<T> + SamplerPrimitive<T> +
39 CommandListPrimitive<T> + QueuePrimitive<T> + FencePrimitive<T> +
40 SwapchainPrimitive<T>
41 where T: CobraType<T> { }
42#[cfg(feature="vulkan")]
43impl CobraType<Vulkan> for Vulkan { }
44#[cfg(feature="directx")]
45impl CobraType<Directx> for Directx { }
46
47create_primitive!(Cobra);
48
49create_primitive!(Buffer);
50create_primitive!(Image);
51create_primitive!(Sampler);
52
53create_primitive!(CommandList);
54create_primitive!(Queue);
55create_primitive!(Fence);
56
57create_primitive!(Swapchain);