okstd::log

A proc macro for verifying trait implementations on enum variants.

This macro verifies at compile time that all fields in an enum's variants implement the specified traits.

Examples

Basic usage with a single trait:

#![allow(unused)] fn main() { use okstd::prelude::*; pub trait Convertible { fn convert(&self) -> String; } struct Number(i32); impl Convertible for Number { fn convert(&self) -> String { self.0.to_string() } } #[impls(Convertible)] enum Data { Num(Number), // OK - Number implements Convertible } }

Multiple trait bounds:

#![allow(unused)] fn main() { use okstd::prelude::*; use std::fmt::Debug; trait Storage { fn store(&self); } #[derive(Debug)] struct File; impl Storage for File { fn store(&self) { } } #[impls(Storage, Debug)] enum Resource { FileResource(File), // OK - File implements both Storage and Debug } }

Will fail to compile if traits aren't implemented:

use okstd::prelude::*; trait Required {} struct Missing; // Doesn't implement Required #[impls(Required)] enum WontCompile { Bad(Missing), // Error: Missing doesn't implement Required }

Works with fully qualified trait paths:

#![allow(unused)] fn main() { use okstd::prelude::*; mod features { pub trait Advanced {} pub struct Handler; impl Advanced for Handler {} } #[impls(features::Advanced)] enum System { Complex(features::Handler), } }

Multiple variants are checked:

#![allow(unused)] fn main() { use okstd::prelude::*; trait Shared {} struct First; impl Shared for First {} struct Second; impl Shared for Second {} #[impls(Shared)] enum Multi { One(First), Two(Second), } }

Notes

  • Currently only supports tuple variants
  • All fields in a variant must implement all specified traits
  • Compile errors point to the specific variant that fails the trait bounds