1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// This file is part of css. It is subject to the license terms in the COPYRIGHT file found in the top-level directory of this distribution and at https://raw.githubusercontent.com/lemonrock/css/master/COPYRIGHT. No part of predicator, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the COPYRIGHT file.
// Copyright © 2017 The developers of css. See the COPYRIGHT file in the top-level directory of this distribution and at https://raw.githubusercontent.com/lemonrock/css/master/COPYRIGHT.


/// Represents all the things that can go wrong when parsing.
#[derive(Debug)]
pub enum CustomParseError<'i>
{
	// @-rule
	UnsupportedAtRule(CowRcStr<'i>),
	InvalidParseState,
	
	// @charset
	UnexpectedCharsetAtRule,
	
	// @counter-style
	UnsupportedCounterStyleProperty(CowRcStr<'i>),
	InvalidCounterStyleWithoutSymbols(System),
	InvalidCounterStyleNotEnoughSymbols(System),
	InvalidCounterStyleWithoutAdditiveSymbols,
	InvalidCounterStyleExtendsWithSymbols,
	InvalidCounterStyleExtendsWithAdditiveSymbols,
	CounterStyleSystemIsNotKnown(CowRcStr<'i>),
	CounterStyleSymbolsCanNotBeEmpty,
	CounterStyleRangesCanNotHaveStartGreaterThanEnd(i32, i32),
	CounterStylePadMinLengthCanNotBeNegative(i32),
	CounterStyleAdditiveTupleWeightCanNotBeNegative(i32),
	CounterStyleAdditiveSymbolsCanNotHaveASecondWeightEqualToOrGreaterThanTheFirst,
	DecimalOrDiscIsNotAllowedInACounterStyleIdentInACounterStyleAtRule,
	NoneIsNotAllowedInACounterStyleIdent,
	
	// @document
	DocumentAtRuleUrlMatchingFunctionWasInvalid,
	BadUrlInDeclarationValueBlock(CowRcStr<'i>),
	BadStringInDeclarationValueBlock(CowRcStr<'i>),
	UnbalancedCloseParenthesisInDeclarationValueBlock,
	UnbalancedCloseSquareBracketInDeclarationValueBlock,
	UnbalancedCloseCurlyBracketInDeclarationValueBlock,
	
	// @font-face
	UnsupportedFontFaceProperty(CowRcStr<'i>),
	
	// @font-feature-values
	InvalidFontLanguageOverrideIdentifier(CowRcStr<'i>),
	InvalidFontLanguageOverrideOpenTypeLanguageTag(CowRcStr<'i>),
	FontFeatureSettingOpenTypeFeatureTagMustBeFourCharacters(CowRcStr<'i>),
	FontFeatureSettingOpenTypeFeatureTagMustBePrintableAscii(CowRcStr<'i>),
	FontFeatureSettingIfNotAnIntegerMustBeOnOrOff(CowRcStr<'i>),
	FontFeatureSettingIntegerMustBePositive(i32),
	FontFaceAtRuleFontWeightWasNotAValidIdentifierOrInteger,
	FontFaceAtRuleFontFamilyCanNotBeGeneric,
	
	// @import
	AtRuleImportMustBeBeforeAnyRuleExceptAtRuleCharset,
	
	// @keyframes
	KeyframePercentageWasNotBetweenZeroAndOneInclusive(f32),
	ImportantIsNotAllowedInKeyframePropertyDeclarationValues,
	UnexpectedTokenWhenParsingZoom(Token<'i>),
	
	// @media
	InvalidMediaType(CowRcStr<'i>),
	DeprecatedMediaType(CowRcStr<'i>),
	UnrecognisedMediaType(CowRcStr<'i>),
	DeprecatedMediaQueryExpression(CowRcStr<'i>),
	UnsupportedMediaQueryExpression(CowRcStr<'i>),
	RatioNumeratorCanNotBeNegativeOrZero(i32),
	RatioDivisorCanNotBeNegativeOrZero(i32),
	MediaGridMustBeEitherZeroOrOne(i32),
	MediaTransform3DMustBeEitherZeroOrOne(i32),
	MediaTypeIsOnlyOptionalIfQualifiedIsNotSpecified,
	
	// @namespace
	AtRuleNamespaceMustBeBeforeAnyRuleExceptAtRuleCharsetAndAtRuleImport,
	UnexpectedTokenForAtNamespaceRuleNamespaceValue(Token<'i>),
	
	// @page
	InvalidPageSelectorPseudoClass(CowRcStr<'i>),
	FontRelativeLengthsAreNotAllowedInAPageAtRule,
	ViewportLengthsAreNotAllowedInAPageAtRule,
	
	// @supports
	InvalidSupportsCondition(CowRcStr<'i>),
	
	// @viewport
	UnexpectedViewportProperty(CowRcStr<'i>),
	
	// selectors
	SpecificSelectorParseError(Box<SelectorParseError<'i, CustomParseError<'i>>>),
	ThereAreNoSelectors,
	SelectorIsInvalidInContext(String),
	UnsupportedPseudoClassOrElement(String),
	NonTreeStructuralPseudoClassScopeIsObsoleteAsOfFirefox55,
	
	// custom ident
	UnexpectedCustomIdent(CowRcStr<'i>),
	CustomIdentWasExcluded(CowRcStr<'i>),
	
	// numbers & units
	CouldNotParseCssSignedNumber(::domain::numbers::CssNumberConversionError, f32),
	CouldNotParseCssUnsignedNumber(::domain::numbers::CssNumberConversionError, f32),
	CouldNotParseDimensionLessNumber(f32),
	CouldNotParseDimension(f32, CowRcStr<'i>),
	UnsignedIntegersCanNotBeNegative(i32),
	UnsignedIntegersCanNotBeFloats(f32),
	
	// expressions (calc(), var(), attr())
	UnknownFunctionInValueExpression(CowRcStr<'i>),
	CssVariablesInVarExpressionsMustStartWithTwoDashes(CowRcStr<'i>),
}

impl<'i> CustomParseError<'i>
{
	#[inline(always)]
	fn unexpectedToken<T>(unexpectedToken: &Token<'i>) -> Result<T, ParseError<'i, CustomParseError<'i>>>
	{
		Err(ParseError::Basic(BasicParseError::UnexpectedToken(unexpectedToken.clone())))
	}
	
	#[inline(always)]
	fn dimensionless<T>(value: f32) -> Result<T, ParseError<'i, CustomParseError<'i>>>
	{
		Err(ParseError::Custom(CustomParseError::CouldNotParseDimensionLessNumber(value)))
	}
}