pub trait FeatureConditionList<'a>: Sized + Parse<'a>where
Self: 'a,{
type FeatureCondition: Sized + Parse<'a>;
// Required methods
fn keyword_is_not<I>(p: &Parser<'a, I>, c: Cursor) -> bool
where I: Iterator<Item = Cursor> + Clone;
fn keyword_is_or<I>(p: &Parser<'a, I>, c: Cursor) -> bool
where I: Iterator<Item = Cursor> + Clone;
fn keyword_is_and<I>(p: &Parser<'a, I>, c: Cursor) -> bool
where I: Iterator<Item = Cursor> + Clone;
fn build_is(feature: Self::FeatureCondition) -> Self;
fn build_not(keyword: Ident, feature: Self::FeatureCondition) -> Self;
fn build_and(
features: Vec<'a, (Self::FeatureCondition, Option<Ident>)>,
) -> Self;
fn build_or(
features: Vec<'a, (Self::FeatureCondition, Option<Ident>)>,
) -> Self;
// Provided method
fn parse_condition<I>(p: &mut Parser<'a, I>) -> Result<Self>
where I: Iterator<Item = Cursor> + Clone { ... }
}Expand description
This trait can be used for AST nodes representing a list of “Feature Conditions”. This is an amalgamation of
Supports Conditions, Media Conditions, and Container Queries
This is an implementation of <at-rule-list>.
Looking at <supports-condition> and <container-query> we can se almost identical grammars (eliding some tokens
for brevity):
<supports-condition>
│├─╮─ <ident-token "not"> ─ <supports-in-parens> ──────────────────────────────╭──┤│
╰─ <supports-in-parens> ─╮─╭─ <ident-token "and"> ─ <supports-in-parens> ─╮─┤
│ ╰──────────────────────────────────────────────╯ │
├─╭─ <ident-token "or"> ─ <supports-in-parens> ─╮──┤
│ ╰─────────────────────────────────────────────╯ │
╰──────────────────────────────────────────────────╯
<container-query>
│├─╮─ <ident-token "not"> ─ <query-in-parens> ───────────────────────────╭──┤│
╰─ <supports-in-parens> ─╮─╭─ <ident-token "and"> ─ <supports-in-parens> ─╮─┤
│ ╰──────────────────────────────────────────────╯ │
├─╭─ <ident-token "or"> ─ <supports-in-parens> ─╮──┤
│ ╰─────────────────────────────────────────────╯ │
╰──────────────────────────────────────────────────╯
<media-condition>
│├─╮─ <ident-token "not"> ─ <media-in-parens> ───────────────────────────╭──┤│
╰─ <media-in-parens> ─╮─╭─ <ident-token "and"> ─ <media-in-parens> ─╮─┤
│ ╰───────────────────────────────────────────╯ │
│─╭─ <ident-token "or"> ─ <media-in-parens> ─╮──│
│ ╰──────────────────────────────────────────╯ │
╰───────────────────────────────────────────────╯The key difference between each of these is their own <*-in-parens> tokens. Thus they could all be defined as:
<condition-prelude-list>
│├─╮─ <ident-token "not"> ─ <feature> ───────────────────╭──┤│
╰─ <feature> ─╮─╭─ <ident-token "and"> ─ <feature> ─╮─┤
│ ╰───────────────────────────────────╯ │
│─╭─ <ident-token "or"> ─ <feature> ─╮──│
│ ╰──────────────────────────────────╯ │
╰───────────────────────────────────────╯Required Associated Types§
type FeatureCondition: Sized + Parse<'a>
Required Methods§
fn keyword_is_not<I>(p: &Parser<'a, I>, c: Cursor) -> bool
fn keyword_is_or<I>(p: &Parser<'a, I>, c: Cursor) -> bool
fn keyword_is_and<I>(p: &Parser<'a, I>, c: Cursor) -> bool
fn build_is(feature: Self::FeatureCondition) -> Self
fn build_not(keyword: Ident, feature: Self::FeatureCondition) -> Self
fn build_and(features: Vec<'a, (Self::FeatureCondition, Option<Ident>)>) -> Self
fn build_or(features: Vec<'a, (Self::FeatureCondition, Option<Ident>)>) -> Self
Provided Methods§
fn parse_condition<I>(p: &mut Parser<'a, I>) -> Result<Self>
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.