css_ast/types/
opacity_value.rs1use 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}