Skip to main content

css_ast/types/
opacity_value.rs

1use super::prelude::*;
2use crate::Percentage;
3
4#[derive(
5	IntoCursor, ToSpan, SemanticEq, Peek, Parse, ToCursors, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash,
6)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize))]
8#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
9#[derive(csskit_derives::NodeWithMetadata)]
10pub enum OpacityValue {
11	Number(T![Number]),
12	Percent(Percentage),
13}
14
15impl OpacityValue {
16	#[allow(non_upper_case_globals)]
17	pub const Zero: OpacityValue = OpacityValue::Number(<T![Number]>::NUMBER_ZERO);
18}
19
20impl From<OpacityValue> for i32 {
21	fn from(value: OpacityValue) -> Self {
22		match value {
23			OpacityValue::Number(t) => t.into(),
24			OpacityValue::Percent(t) => {
25				let f: f32 = t.into();
26				f as i32
27			}
28		}
29	}
30}
31
32impl From<OpacityValue> for f32 {
33	fn from(value: OpacityValue) -> Self {
34		match value {
35			OpacityValue::Number(t) => t.into(),
36			OpacityValue::Percent(t) => t.into(),
37		}
38	}
39}
40
41#[cfg(test)]
42mod tests {
43	use super::*;
44	use crate::CssAtomSet;
45	use css_parse::{assert_parse, assert_peek_false};
46
47	#[test]
48	fn size_test() {
49		assert_eq!(std::mem::size_of::<OpacityValue>(), 16);
50	}
51
52	#[test]
53	fn test_writes() {
54		assert_parse!(CssAtomSet::ATOMS, OpacityValue, "0.1");
55		assert_parse!(CssAtomSet::ATOMS, OpacityValue, "1");
56		assert_parse!(CssAtomSet::ATOMS, OpacityValue, "50%");
57		assert_parse!(CssAtomSet::ATOMS, OpacityValue, "20");
58		assert_parse!(CssAtomSet::ATOMS, OpacityValue, "1000%");
59		assert_parse!(CssAtomSet::ATOMS, OpacityValue, "-2");
60	}
61
62	#[test]
63	fn test_errors() {
64		assert_peek_false!(CssAtomSet::ATOMS, OpacityValue, "red");
65		assert_peek_false!(CssAtomSet::ATOMS, OpacityValue, "10px");
66	}
67}