use crate::derives::*;
use crate::values::animated::ToAnimatedZero;
use crate::values::generics::position::{GenericPosition, GenericPositionOrAuto};
use crate::values::specified::motion::CoordBox;
use serde::Deserializer;
use std::fmt::{self, Write};
use style_traits::{CssWriter, ToCss};
#[allow(missing_docs)]
#[derive(
Animate,
Clone,
ComputeSquaredDistance,
Copy,
Debug,
Deserialize,
MallocSizeOf,
Parse,
PartialEq,
Serialize,
SpecifiedValueInfo,
ToAnimatedValue,
ToComputedValue,
ToCss,
ToResolvedValue,
ToShmem,
)]
#[repr(u8)]
pub enum RaySize {
ClosestSide,
ClosestCorner,
FarthestSide,
FarthestCorner,
Sides,
}
#[derive(
Animate,
Clone,
ComputeSquaredDistance,
Debug,
Deserialize,
MallocSizeOf,
PartialEq,
Serialize,
SpecifiedValueInfo,
ToAnimatedValue,
ToComputedValue,
ToResolvedValue,
ToShmem,
)]
#[repr(C)]
pub struct GenericRayFunction<Angle, Position> {
pub angle: Angle,
pub size: RaySize,
#[animation(constant)]
pub contain: bool,
pub position: GenericPositionOrAuto<Position>,
}
pub use self::GenericRayFunction as RayFunction;
impl<Angle, Position> ToCss for RayFunction<Angle, Position>
where
Angle: ToCss,
Position: ToCss,
{
fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
where
W: Write,
{
self.angle.to_css(dest)?;
if !matches!(self.size, RaySize::ClosestSide) {
dest.write_char(' ')?;
self.size.to_css(dest)?;
}
if self.contain {
dest.write_str(" contain")?;
}
if !matches!(self.position, GenericPositionOrAuto::Auto) {
dest.write_str(" at ")?;
self.position.to_css(dest)?;
}
Ok(())
}
}
fn deserialize_url<'de, D, T>(_deserializer: D) -> Result<T, D::Error>
where
D: Deserializer<'de>,
{
use crate::serde::de::Error;
Err(<D as Deserializer>::Error::custom(
"we don't support the deserializing for url",
))
}
#[derive(
Animate,
Clone,
ComputeSquaredDistance,
Debug,
Deserialize,
MallocSizeOf,
PartialEq,
Serialize,
SpecifiedValueInfo,
ToAnimatedValue,
ToComputedValue,
ToCss,
ToResolvedValue,
ToShmem,
)]
#[animation(no_bound(U))]
#[repr(C, u8)]
pub enum GenericOffsetPathFunction<Shapes, RayFunction, U> {
#[css(function)]
Ray(RayFunction),
#[animation(error)]
#[serde(deserialize_with = "deserialize_url")]
#[serde(skip_serializing)]
Url(U),
Shape(Shapes),
}
pub use self::GenericOffsetPathFunction as OffsetPathFunction;
#[derive(
Animate,
Clone,
ComputeSquaredDistance,
Debug,
Deserialize,
MallocSizeOf,
PartialEq,
Serialize,
SpecifiedValueInfo,
ToAnimatedValue,
ToComputedValue,
ToCss,
ToResolvedValue,
ToShmem,
ToTyped,
)]
#[repr(C, u8)]
#[typed(todo_derive_fields)]
pub enum GenericOffsetPath<Function> {
OffsetPath {
path: Box<Function>,
#[css(skip_if = "CoordBox::is_default")]
coord_box: CoordBox,
},
CoordBox(CoordBox),
#[animation(error)]
None,
}
pub use self::GenericOffsetPath as OffsetPath;
impl<Function> OffsetPath<Function> {
#[inline]
pub fn none() -> Self {
OffsetPath::None
}
}
impl<Function> ToAnimatedZero for OffsetPath<Function> {
#[inline]
fn to_animated_zero(&self) -> Result<Self, ()> {
Err(())
}
}
#[derive(
Animate,
Clone,
ComputeSquaredDistance,
Copy,
Debug,
Deserialize,
MallocSizeOf,
Parse,
PartialEq,
Serialize,
SpecifiedValueInfo,
ToAnimatedValue,
ToAnimatedZero,
ToComputedValue,
ToCss,
ToResolvedValue,
ToShmem,
ToTyped,
)]
#[repr(C, u8)]
pub enum GenericOffsetPosition<H, V> {
Normal,
Auto,
Position(
#[css(field_bound)]
#[parse(field_bound)]
GenericPosition<H, V>,
),
}
pub use self::GenericOffsetPosition as OffsetPosition;
impl<H, V> OffsetPosition<H, V> {
#[inline]
pub fn normal() -> Self {
Self::Normal
}
}