use {cssparser::ToCss, std::fmt};
#[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub enum VendorPrefix {
o,
moz,
epub,
webkit,
ms,
servo,
Unrecognised(String),
}
impl ToCss for VendorPrefix {
fn to_css<W: fmt::Write>(&self, dest: &mut W) -> fmt::Result {
use self::VendorPrefix::*;
match *self {
o => dest.write_str("-o-"),
moz => dest.write_str("-moz-"),
webkit => dest.write_str("-webkit-"),
ms => dest.write_str("-ms-"),
servo => dest.write_str("-servo-"),
epub => dest.write_str("-epub-"),
Unrecognised(ref prefix) => {
dest.write_char('-')?;
dest.write_str(prefix.as_str())?;
dest.write_char('-')
}
}
}
}
impl VendorPrefix {
#[inline(always)]
pub fn findPrefixIfAnyForAsciiLowerCaseName<'i>(
asciiLowerCaseName: String,
) -> (Option<VendorPrefix>, String) {
if asciiLowerCaseName.len() < 3 {
return (None, asciiLowerCaseName);
}
{
let (firstCharacter, remainder) = asciiLowerCaseName.split_at(1);
if firstCharacter == "-" && !remainder.starts_with('-') {
let mut split = remainder.splitn(2, '-');
let prefix = split.next().unwrap();
let unprefixedRemainder = split.next().unwrap();
use self::VendorPrefix::*;
return match prefix {
"o" => (Some(o), unprefixedRemainder.to_owned()),
"moz" => (Some(moz), unprefixedRemainder.to_owned()),
"webkit" => (Some(webkit), unprefixedRemainder.to_owned()),
"ms" => (Some(ms), unprefixedRemainder.to_owned()),
"servo" => (Some(servo), unprefixedRemainder.to_owned()),
_ => (
Some(Unrecognised(prefix.to_owned())),
unprefixedRemainder.to_owned(),
),
};
}
}
(None, asciiLowerCaseName)
}
#[inline(always)]
pub fn prefix(&self, name: &str) -> String {
use self::VendorPrefix::*;
fn knownPrefix(prefix: &str, name: &str) -> String {
let mut prefixed = String::with_capacity(prefix.len() + name.len());
prefixed.push_str(prefix);
prefixed.push_str(name);
prefixed
}
match self {
&o => knownPrefix("-o-", name),
&moz => knownPrefix("-moz-", name),
&epub => knownPrefix("-epub-", name),
&webkit => knownPrefix("-webkit-", name),
&ms => knownPrefix("-ms-", name),
&servo => knownPrefix("-servo-", name),
&Unrecognised(ref prefix) => {
let mut prefixed =
String::with_capacity(1 + prefix.len() + 1 + name.len());
prefixed.push('-');
prefixed.push_str(prefix);
prefixed.push('-');
prefixed.push_str(name);
prefixed
}
}
}
}