#![doc = include_str!("readme.md")]
use core::range::Range;
use oak_core::tree::{GreenNode, RedNode, TypedNode};
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub enum Selector {
Element(String),
Class(String),
Id(String),
Attribute {
name: String,
value: Option<String>,
operator: Option<String>,
},
PseudoClass(String),
PseudoElement(String),
Descendant(Box<Selector>, Box<Selector>),
Child(Box<Selector>, Box<Selector>),
AdjacentSibling(Box<Selector>, Box<Selector>),
GeneralSibling(Box<Selector>, Box<Selector>),
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Clone, Debug, PartialEq)]
pub enum Value {
Keyword(String),
Numeric {
value: f64,
unit: Option<String>,
},
Color(String),
String(String),
Url(String),
Function {
name: String,
arguments: Vec<Value>,
},
List(Vec<Value>),
Nested(Box<Value>),
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Clone, Debug, PartialEq)]
pub struct Declaration {
pub property: String,
pub value: Value,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Clone, Debug, PartialEq)]
pub struct RuleSet {
pub selectors: Vec<Selector>,
pub declarations: Vec<Declaration>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Clone, Debug, PartialEq)]
pub enum AtRule {
Media {
condition: String,
rules: Vec<RuleSet>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Import {
path: String,
media: Option<String>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
FontFace {
declarations: Vec<Declaration>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Keyframes {
name: String,
keyframes: Vec<(String, Vec<Declaration>)>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
Other {
name: String,
content: String,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: Range<usize>,
},
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Clone, Debug, PartialEq)]
pub enum CssNode {
RuleSet(RuleSet),
AtRule(AtRule),
Comment(String),
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Clone, Debug, PartialEq)]
pub struct CssRoot {
pub nodes: Vec<CssNode>,
}
impl<'a> TypedNode<'a> for CssRoot {
type Language = crate::CssLanguage;
fn cast(_node: RedNode<'a, Self::Language>) -> Option<Self> {
Some(Self { nodes: Vec::new() })
}
fn green(&self) -> &'a GreenNode<'a, Self::Language> {
panic!("CssRoot::green() not implemented")
}
}