1pub mod at_queries;
55pub mod base_types;
56pub mod css_types;
57pub mod properties;
58pub mod token_parser;
59pub mod token_types;
60
61pub mod css_value;
62pub mod flex_parser;
63
64#[cfg(test)]
65pub mod tests;
66
67pub use at_queries::last_media_query_wins_transform;
68pub use token_parser as tokenParser;
69
70pub use css_value::CssValue;
71pub use flex_parser::{FlexCombinators, FlexParser};
72
73#[derive(Debug, Clone, thiserror::Error)]
75pub enum CssParseError {
76 #[error("Parse error: {message}")]
77 ParseError { message: String },
78
79 #[error("Invalid CSS value: {value}")]
80 InvalidValue { value: String },
81
82 #[error("Unexpected end of input")]
83 UnexpectedEndOfInput,
84
85 #[error("Invalid token: {token}")]
86 InvalidToken { token: String },
87}
88
89pub type CssResult<T> = std::result::Result<T, CssParseError>;
91
92#[cfg(test)]
93mod lib_tests {
94 use super::*;
95
96 #[test]
97 fn test_api_exports_available() {
98 let _token_parser = tokenParser::TokenParser::<i32>::never();
100
101 let _transform = properties::Transform::new(vec![]);
103 let _box_shadow = properties::BoxShadow::new(
104 css_types::Length::new(0.0, "px".to_string()),
105 css_types::Length::new(0.0, "px".to_string()),
106 css_types::Length::new(0.0, "px".to_string()),
107 css_types::Length::new(0.0, "px".to_string()),
108 css_types::Color::Named(css_types::NamedColor::new("black".to_string())),
109 false,
110 );
111 let _border_radius = properties::BorderRadiusIndividual::new(
112 css_types::LengthPercentage::Length(css_types::Length::new(0.0, "px".to_string())),
113 None,
114 );
115
116 let styles = vec![];
118 let _transformed = last_media_query_wins_transform(&styles);
119
120 let _color = css_types::Color::parse();
122 let _length = css_types::Length::parser();
123 let _calc = css_types::Calc::parse();
124 }
125
126 #[test]
127 fn test_standard_imports() {
128 use crate::css_types::{Calc, Color, Length};
129 use crate::{last_media_query_wins_transform, properties};
130
131 let _transform = properties::Transform::new(vec![]);
132 let _transform_fn = last_media_query_wins_transform;
133 let _color_parser = Color::parse();
134 let _length_parser = Length::parser();
135 let _calc_parser = Calc::parse();
136 }
137
138 #[test]
139 fn test_crate_level_types() {
140 let error = CssParseError::ParseError {
142 message: "test error".to_string(),
143 };
144
145 let result: CssResult<i32> = Err(error);
146 assert!(result.is_err());
147 }
148
149 #[test]
150 fn test_module_accessibility() {
151 let _substring = base_types::SubString::new("test");
153 let _token_list = token_types::TokenList::new("test");
154 let _token_parser = token_parser::TokenParser::<()>::never();
155 let _color = css_types::Color::parse();
156 let _transform = properties::Transform::new(vec![]);
157 let _media_query = at_queries::MediaQuery::parser()
158 .parse_to_end("@media screen")
159 .unwrap();
160 }
161
162 #[test]
163 fn test_error_types_comprehensive() {
164 let errors = vec![
166 CssParseError::ParseError {
167 message: "parse error".to_string(),
168 },
169 CssParseError::InvalidValue {
170 value: "invalid".to_string(),
171 },
172 CssParseError::UnexpectedEndOfInput,
173 CssParseError::InvalidToken {
174 token: "bad".to_string(),
175 },
176 ];
177
178 for error in errors {
179 let _cloned = error.clone();
181 let _debug_str = format!("{:?}", error);
182 let _display_str = format!("{}", error);
183 }
184 }
185
186 #[test]
187 fn test_readme_example_compatibility() {
188 use crate::css_types::{Calc, Color, Length};
190 use crate::{last_media_query_wins_transform, properties};
191
192 let _color = Color::parse(); let _length = Length::parser(); let _calc = Calc::parse(); let _transform = properties::Transform::parser();
199 let _box_shadow = properties::BoxShadow::parser();
200 let _border_radius = properties::BorderRadiusShorthand::parser();
201
202 let styles = vec![];
204 let _transformed = last_media_query_wins_transform(&styles);
205 }
206}