use crate::{CursorSink, DeclarationValue, Parse, Parser, Peek, Result as ParserResult, ToCursors, Cursor, Kind, BangImportant, diagnostics};
use bumpalo::collections::{Vec, vec::IntoIter};
#[derive(ToSpan, ToCursors, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
pub struct Declaration<T: DeclarationValue> {
pub name: T![Ident],
pub colon: T![:],
pub value: StyleValue<'a>,
pub important: Option<BangImportant>,
pub semicolon: Option<T![;]>,
}
impl<'a> Peek<'a> for Property<'a> {
fn peek(p: &Parser<'a>, c: Cursor) -> bool {
<T![Ident]>::peek(p, c) && p.peek_n(2) == Kind::Colon
}
}
impl<'a> Parse<'a> for Property<'a> {
fn parse(p: &mut Parser<'a>) -> ParserResult<Self> {
let name = p.parse::<T![Ident]>()?;
let c: Cursor = name.into();
if !Self::valid_property(p, c) {
Err(Diagnostic::unknown_declaration(c.into()))?;
}
let colon = p.parse::<T![:]>()?;
let value = Self::DeclarationValue::parse_declaration_value(p, c)?;
let important = p.parse_if_peek::<BangImportant>()?;
let semicolon = p.parse_if_peek::<T![;]>()?;
Ok(Self { name, colon, value, important, semicolon })
}
}