css_inspector
Rust CSS validator. This crate is primarily “suite-driven”: it implements the checks needed to match the upstream W3C CSS Validator autotest fixtures, rather than a complete CSS parser.
MSRV: Rust 1.93 (Edition 2024).
Install
cargo add css_inspector
Entry points
validate_css_text(css, &Config) -> Report: validates a stylesheet as text.validate_css_declarations_text(decls, &Config) -> Report: validates a declaration list (e.g. an HTMLstyle=""attribute).validate_css_text_with_fetcher(css, base_uri, &Config, &dyn Fetcher) -> Report: likevalidate_css_text, but recursively validates top-level@import url(...)sheets via a fetcher.validate_css_uri_with_fetcher(uri, &Config, &dyn Fetcher) -> Report: fetches CSS then validates withvalidate_css_text_with_fetcher.
Configuration
Config currently supports:
profile: selects the “known properties” set (defaults to CSS4) fromdata/css_properties/*.properties.medium: if set, warns when an@media ... {block doesn’t match the configured medium.warning: numeric warning threshold (default0);-1suppresses all warnings.
Checks performed (today)
High-level checks (errors unless noted):
- Comment handling: strips
/* ... */; unterminated comments reportUnclosed comment.. - Top-level structure:
- Unbalanced
{}(Unbalanced braces.). - Stray trailing
\\(Invalid escape at end of input.). - Top-level
<(Invalid input.) as a cheap “HTML in CSS” guard. - Stray top-level
prop: value;segments (Stray declaration outside a rule.).
- Unbalanced
- At-rule name check: unknown
@...names are rejected (Unknown at-rule.). @mediavsConfig.medium(warning):Properties for other media might not work for usermedium.- Selector checks (minimal): basic sanity checks + pseudo validation against a profile-dependent allowlist.
- Attribute selector conflicts (warning): detects unsatisfiable combinations like
[a="x"][a="y"]. - Declarations:
- Syntax checks (
prop: value, property-name validity, missing;recovery). - Unknown properties: rejected based on the selected profile’s “known properties” list
(custom properties
--fooare allowed). - Vendor extension properties:
- Usually reported as unknown-property errors.
- When
warning = -1(warnings suppressed), they are demoted to warnings, which are then suppressed, so they produce no messages (matching the suite’s expectations).
- Values:
- Missing values.
- CSS-wide keyword sanity (rejects mixing wide keywords with other tokens).
- “Too many tokens” for many single-valued properties.
- Suite-driven value validation for a limited set of properties (e.g.
color,background*,border*,outline*,font,cursor,content,counter-*,quotes,filter, etc).
- Syntax checks (
- Optional top-level
@importhandling:- Text-only validation: if a top-level
@import url(...)exists, warns once:Imported style sheets are not checked. - Fetching validation: recursively fetches and validates imported sheets first (with loop detection).
- Text-only validation: if a top-level
Fetching
This crate defines Fetcher and a default StdFetcher:
file://...is supported.http://andhttps://are supported only whenStdFetcher.allow_network = true.- Other schemes are rejected.
Note: StdFetcher is intended for test harnesses / controlled usage. If you validate untrusted CSS
with fetching enabled, treat the fetcher configuration as part of your security boundary.