Twust - Static TailwindCSS Validation in Rust

Twust is a compile-time TailwindCSS static checker for Rust. It validates class names before runtime, preventing typos, incorrect class names, and misconfigurations.

Why Twust?

  • Compile-time validation: Catch invalid TailwindCSS classes before your Rust app runs.
  • Zero runtime overhead: Errors are flagged at compile time.
  • Supports Tailwind plugins like DaisyUI (via feature flags).
  • Works with Rust UI frameworks (Leptos, Dioxus, Yew, Sycamore).
#![allow(unused)]
fn main() {
use twust::tw;

let class = tw!("bg-blue-500 text-lg hover:bg-blue-600");
assert_eq!(class, "bg-blue-500 text-lg hover:bg-blue-600");
}

Installation

Twust is available on crates.io. Add it to your Cargo.toml:

[dependencies]
twust = "1.0.7"

# Enable optional features like daisyui:
twust = { version = "1.0.7", features = ["daisyui"] }

Usage

Twust provides macros to validate TailwindCSS classes at compile time.

Basic Example

#![allow(unused)]

fn main() {
use twust::tw;

let class = tw!("bg-red-500 text-lg");
assert_eq!(class, "bg-red-500 text-lg");

}

Restricting to One Class

#![allow(unused)]

fn main() {
use twust::tw1;

let single_class = tw1!("bg-blue-500");
assert_eq!(single_class, "bg-blue-500");

}

Using Multiple Classes As Array

#![allow(unused)]

fn main() {
use twust::tws;

let class_list = tws!["bg-red-500 text-lg", "p-4 bg-blue-500"];
assert_eq!(class_list, ["bg-red-500", "text-lg", "p-4"]);

}

Using Multiple Classes As Array: One class per item

#![allow(unused)]

fn main() {
use twust::tws1;

let class_list = tws1!["bg-red-500", "text-lg", "p-4"];
assert_eq!(class_list, ["bg-red-500", "text-lg", "p-4"]);

}

Macros

Twust provides the following macros:

tw! - Type-Checked Tailwind Classes

#![allow(unused)]

fn main() {
use twust::tw;

let class = tw!("hover:bg-green-500 text-white font-bold");
assert_eq!(class, "hover:bg-green-500 text-white font-bold");

}

tws! - Compile-time Checked Array of Classes

#![allow(unused)]

fn main() {
use twust::tws;

let class_list = tws!["border", "rounded-md", "shadow"];
assert_eq!(class_list, ["border", "rounded-md", "shadow"]);

}

tw1! - Single Tailwind Class Only

#![allow(unused)]

fn main() {
use twust::tw1;

let single_class = tw1!("flex");
assert_eq!(single_class, "flex");

}

tws1! - Array of Single-Class Items Only

#![allow(unused)]

fn main() {
use twust::tws1;

let class_list = tws1!["text-xl", "border", "m-4"];
assert_eq!(class_list, ["text-xl", "border", "m-4"]);

}

Configuration

Tailwind Configuration

Twust reads custom Tailwind settings from tailwind.config.json.

Example Configuration

{
  "theme": {
    "extend": {
      "colors": {
        "primary": "#ff6347",
        "secondary": "#4a90e2"
      }
    }
  },
  "corePlugins": {
    "preflight": false
  },
  "variants": {
    "backgroundColor": ["responsive", "hover", "focus"]
  }
}

Using Custom Classes

#![allow(unused)]
fn main() {
tw!("bg-primary text-secondary hover:bg-secondary");
}

FAQ

Why use Twust instead of tailwindcss-to-rust?

Twust is simpler, requires no setup, and validates classes at compile-time instead of generating code.

Can I use this with DaisyUI?

Yes! Enable the feature flag:

twust = { version = "1.0.7", features = ["daisyui"] }

Contributing

Steps

  1. Fork the repository.
  2. Clone it locally:
git clone https://github.com/oyelowo/twust.git
  1. Create a feature branch:
git checkout -b feature-name
  1. Make changes and commit:
git commit -m "Add new feature"
  1. Push your branch and open a PR.

License

License

Twust is licensed under MIT/Apache-2.0.

© Oyelowo Oyedayo. See LICENSE for details.