pub mod builtin;
pub mod complex;
pub mod convert;
pub mod equality;
pub mod facets;
#[cfg(feature = "xsd11")]
pub mod sequence;
pub mod simple;
pub mod validators;
pub mod value;
pub use builtin::BuiltinTypes;
pub use complex::{
AttributeUse, AttributeUseKind, AttributeWildcard, ComplexTypeContent, ComplexTypeDef,
Compositor, ContentKind, ContentParticle, ContentTerm, DerivationMethod, ModelGroupDef,
NamespaceConstraint, ProcessContents,
};
pub use convert::{ConversionError, ConversionResult, IntoXmlValue, TypeConverter};
pub use facets::{
facet_applicable, facet_applicable_for_type, normalize_whitespace, AssertionFacet,
EnumerationFacet, ExplicitTimezone, ExplicitTimezoneFacet, FacetApplicability, FacetFixed,
FacetKind, FacetSet, FractionDigitsFacet, LengthFacet, MaxExclusiveFacet, MaxInclusiveFacet,
MaxLengthFacet, MinExclusiveFacet, MinInclusiveFacet, MinLengthFacet, PatternFacet,
TotalDigitsFacet, WhitespaceFacet, WhitespaceMode,
};
#[cfg(feature = "xsd11")]
pub use sequence::{
resolve_list_item_schema_type, ItemType, NameTest, SequenceType, XmlTypeCardinality,
};
pub use simple::{
BuiltInType, SimpleTypeDef, SimpleTypeDerivationMethod, SimpleTypeRef, SimpleTypeVariety,
};
pub use validators::{
TypeValidator, ValidationError, ValidationResult, ValidatorRegistry, VALIDATOR_REGISTRY,
};
pub use value::{
DateTimeValue, DateValue, DayTimeDurationValue, DurationValue, GDayValue, GMonthDayValue,
GMonthValue, GYearMonthValue, GYearValue, TimeValue, TimezoneOffset, XmlAtomicValue, XmlValue,
XmlValueKind, YearMonthDurationValue,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[repr(u8)]
#[derive(Default)]
pub enum XmlTypeCode {
#[default]
None = 0,
Item = 1,
Node = 2,
Document = 3,
Element = 4,
Attribute = 5,
Namespace = 6,
ProcessingInstruction = 7,
Comment = 8,
Text = 9,
AnyType = 10,
AnySimpleType = 11,
AnyAtomicType = 12,
UntypedAtomic = 13,
String = 14,
NormalizedString = 15,
Token = 16,
Language = 17,
NmToken = 18,
Name = 19,
NCName = 20,
Id = 21,
IdRef = 22,
Entity = 23,
Boolean = 24,
Decimal = 25,
Float = 26,
Double = 27,
Integer = 28,
NonPositiveInteger = 29,
NegativeInteger = 30,
Long = 31,
Int = 32,
Short = 33,
Byte = 34,
NonNegativeInteger = 35,
UnsignedLong = 36,
UnsignedInt = 37,
UnsignedShort = 38,
UnsignedByte = 39,
PositiveInteger = 40,
Duration = 41,
DateTime = 42,
Time = 43,
Date = 44,
GYearMonth = 45,
GYear = 46,
GMonthDay = 47,
GDay = 48,
GMonth = 49,
YearMonthDuration = 50,
DayTimeDuration = 51,
DateTimeStamp = 52,
HexBinary = 53,
Base64Binary = 54,
AnyUri = 55,
QName = 56,
Notation = 57,
NmTokens = 58,
IdRefs = 59,
Entities = 60,
Error = 61,
}
impl XmlTypeCode {
#[inline]
pub fn is_node(&self) -> bool {
matches!(
self,
Self::Node
| Self::Document
| Self::Element
| Self::Attribute
| Self::Namespace
| Self::ProcessingInstruction
| Self::Comment
| Self::Text
)
}
#[inline]
pub fn is_atomic(&self) -> bool {
(*self as u8) >= Self::UntypedAtomic as u8
&& !matches!(
self,
Self::NmTokens | Self::IdRefs | Self::Entities | Self::Error
)
}
#[inline]
pub fn is_list(&self) -> bool {
matches!(self, Self::NmTokens | Self::IdRefs | Self::Entities)
}
#[inline]
pub fn is_primitive_atomic(&self) -> bool {
matches!(
self,
Self::String
| Self::Boolean
| Self::Decimal
| Self::Float
| Self::Double
| Self::Duration
| Self::DateTime
| Self::Time
| Self::Date
| Self::GYearMonth
| Self::GYear
| Self::GMonthDay
| Self::GDay
| Self::GMonth
| Self::HexBinary
| Self::Base64Binary
| Self::AnyUri
| Self::QName
| Self::Notation
)
}
#[inline]
pub fn is_numeric(&self) -> bool {
matches!(
self,
Self::Decimal
| Self::Float
| Self::Double
| Self::Integer
| Self::NonPositiveInteger
| Self::NegativeInteger
| Self::Long
| Self::Int
| Self::Short
| Self::Byte
| Self::NonNegativeInteger
| Self::UnsignedLong
| Self::UnsignedInt
| Self::UnsignedShort
| Self::UnsignedByte
| Self::PositiveInteger
)
}
#[inline]
pub fn is_date_time(&self) -> bool {
matches!(
self,
Self::Duration
| Self::DateTime
| Self::Time
| Self::Date
| Self::GYearMonth
| Self::GYear
| Self::GMonthDay
| Self::GDay
| Self::GMonth
| Self::YearMonthDuration
| Self::DayTimeDuration
| Self::DateTimeStamp
)
}
#[inline]
pub fn is_string_derived(&self) -> bool {
matches!(
self,
Self::String
| Self::NormalizedString
| Self::Token
| Self::Language
| Self::NmToken
| Self::Name
| Self::NCName
| Self::Id
| Self::IdRef
| Self::Entity
)
}
#[inline]
pub fn is_xsd11(&self) -> bool {
matches!(
self,
Self::AnyAtomicType
| Self::YearMonthDuration
| Self::DayTimeDuration
| Self::DateTimeStamp
| Self::Error
)
}
#[inline]
pub fn list_item_type(&self) -> Option<XmlTypeCode> {
match self {
Self::NmTokens => Some(Self::NmToken),
Self::IdRefs => Some(Self::IdRef),
Self::Entities => Some(Self::Entity),
_ => None,
}
}
pub fn local_name(&self) -> Option<&'static str> {
match self {
Self::None
| Self::Item
| Self::Node
| Self::Document
| Self::Element
| Self::Attribute
| Self::Namespace
| Self::ProcessingInstruction
| Self::Comment
| Self::Text => None,
Self::AnyType => Some("anyType"),
Self::AnySimpleType => Some("anySimpleType"),
Self::AnyAtomicType => Some("anyAtomicType"),
Self::UntypedAtomic => Some("untypedAtomic"),
Self::String => Some("string"),
Self::NormalizedString => Some("normalizedString"),
Self::Token => Some("token"),
Self::Language => Some("language"),
Self::NmToken => Some("NMTOKEN"),
Self::Name => Some("Name"),
Self::NCName => Some("NCName"),
Self::Id => Some("ID"),
Self::IdRef => Some("IDREF"),
Self::Entity => Some("ENTITY"),
Self::Boolean => Some("boolean"),
Self::Decimal => Some("decimal"),
Self::Float => Some("float"),
Self::Double => Some("double"),
Self::Integer => Some("integer"),
Self::NonPositiveInteger => Some("nonPositiveInteger"),
Self::NegativeInteger => Some("negativeInteger"),
Self::Long => Some("long"),
Self::Int => Some("int"),
Self::Short => Some("short"),
Self::Byte => Some("byte"),
Self::NonNegativeInteger => Some("nonNegativeInteger"),
Self::UnsignedLong => Some("unsignedLong"),
Self::UnsignedInt => Some("unsignedInt"),
Self::UnsignedShort => Some("unsignedShort"),
Self::UnsignedByte => Some("unsignedByte"),
Self::PositiveInteger => Some("positiveInteger"),
Self::Duration => Some("duration"),
Self::DateTime => Some("dateTime"),
Self::Time => Some("time"),
Self::Date => Some("date"),
Self::GYearMonth => Some("gYearMonth"),
Self::GYear => Some("gYear"),
Self::GMonthDay => Some("gMonthDay"),
Self::GDay => Some("gDay"),
Self::GMonth => Some("gMonth"),
Self::YearMonthDuration => Some("yearMonthDuration"),
Self::DayTimeDuration => Some("dayTimeDuration"),
Self::DateTimeStamp => Some("dateTimeStamp"),
Self::HexBinary => Some("hexBinary"),
Self::Base64Binary => Some("base64Binary"),
Self::AnyUri => Some("anyURI"),
Self::QName => Some("QName"),
Self::Notation => Some("NOTATION"),
Self::NmTokens => Some("NMTOKENS"),
Self::IdRefs => Some("IDREFS"),
Self::Entities => Some("ENTITIES"),
Self::Error => Some("error"),
}
}
pub fn from_local_name(name: &str) -> Option<XmlTypeCode> {
match name {
"anyType" => Some(Self::AnyType),
"anySimpleType" => Some(Self::AnySimpleType),
"anyAtomicType" => Some(Self::AnyAtomicType),
"untypedAtomic" => Some(Self::UntypedAtomic),
"string" => Some(Self::String),
"normalizedString" => Some(Self::NormalizedString),
"token" => Some(Self::Token),
"language" => Some(Self::Language),
"NMTOKEN" => Some(Self::NmToken),
"Name" => Some(Self::Name),
"NCName" => Some(Self::NCName),
"ID" => Some(Self::Id),
"IDREF" => Some(Self::IdRef),
"ENTITY" => Some(Self::Entity),
"boolean" => Some(Self::Boolean),
"decimal" => Some(Self::Decimal),
"float" => Some(Self::Float),
"double" => Some(Self::Double),
"integer" => Some(Self::Integer),
"nonPositiveInteger" => Some(Self::NonPositiveInteger),
"negativeInteger" => Some(Self::NegativeInteger),
"long" => Some(Self::Long),
"int" => Some(Self::Int),
"short" => Some(Self::Short),
"byte" => Some(Self::Byte),
"nonNegativeInteger" => Some(Self::NonNegativeInteger),
"unsignedLong" => Some(Self::UnsignedLong),
"unsignedInt" => Some(Self::UnsignedInt),
"unsignedShort" => Some(Self::UnsignedShort),
"unsignedByte" => Some(Self::UnsignedByte),
"positiveInteger" => Some(Self::PositiveInteger),
"duration" => Some(Self::Duration),
"dateTime" => Some(Self::DateTime),
"time" => Some(Self::Time),
"date" => Some(Self::Date),
"gYearMonth" => Some(Self::GYearMonth),
"gYear" => Some(Self::GYear),
"gMonthDay" => Some(Self::GMonthDay),
"gDay" => Some(Self::GDay),
"gMonth" => Some(Self::GMonth),
"yearMonthDuration" => Some(Self::YearMonthDuration),
"dayTimeDuration" => Some(Self::DayTimeDuration),
"dateTimeStamp" => Some(Self::DateTimeStamp),
"hexBinary" => Some(Self::HexBinary),
"base64Binary" => Some(Self::Base64Binary),
"anyURI" => Some(Self::AnyUri),
"QName" => Some(Self::QName),
"NOTATION" => Some(Self::Notation),
"NMTOKENS" => Some(Self::NmTokens),
"IDREFS" => Some(Self::IdRefs),
"ENTITIES" => Some(Self::Entities),
"error" => Some(Self::Error),
_ => None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum PrimitiveTypeCode {
String,
Boolean,
Decimal,
Float,
Double,
Duration,
DateTime,
Time,
Date,
GYearMonth,
GYear,
GMonthDay,
GDay,
GMonth,
HexBinary,
Base64Binary,
AnyUri,
QName,
Notation,
}
impl PrimitiveTypeCode {
pub fn from_type_code(code: XmlTypeCode) -> Option<Self> {
match code {
XmlTypeCode::String
| XmlTypeCode::NormalizedString
| XmlTypeCode::Token
| XmlTypeCode::Language
| XmlTypeCode::NmToken
| XmlTypeCode::Name
| XmlTypeCode::NCName
| XmlTypeCode::Id
| XmlTypeCode::IdRef
| XmlTypeCode::Entity
| XmlTypeCode::UntypedAtomic => Some(Self::String),
XmlTypeCode::Boolean => Some(Self::Boolean),
XmlTypeCode::Decimal
| XmlTypeCode::Integer
| XmlTypeCode::NonPositiveInteger
| XmlTypeCode::NegativeInteger
| XmlTypeCode::Long
| XmlTypeCode::Int
| XmlTypeCode::Short
| XmlTypeCode::Byte
| XmlTypeCode::NonNegativeInteger
| XmlTypeCode::UnsignedLong
| XmlTypeCode::UnsignedInt
| XmlTypeCode::UnsignedShort
| XmlTypeCode::UnsignedByte
| XmlTypeCode::PositiveInteger => Some(Self::Decimal),
XmlTypeCode::Float => Some(Self::Float),
XmlTypeCode::Double => Some(Self::Double),
XmlTypeCode::Duration
| XmlTypeCode::YearMonthDuration
| XmlTypeCode::DayTimeDuration => Some(Self::Duration),
XmlTypeCode::DateTime | XmlTypeCode::DateTimeStamp => Some(Self::DateTime),
XmlTypeCode::Time => Some(Self::Time),
XmlTypeCode::Date => Some(Self::Date),
XmlTypeCode::GYearMonth => Some(Self::GYearMonth),
XmlTypeCode::GYear => Some(Self::GYear),
XmlTypeCode::GMonthDay => Some(Self::GMonthDay),
XmlTypeCode::GDay => Some(Self::GDay),
XmlTypeCode::GMonth => Some(Self::GMonth),
XmlTypeCode::HexBinary => Some(Self::HexBinary),
XmlTypeCode::Base64Binary => Some(Self::Base64Binary),
XmlTypeCode::AnyUri => Some(Self::AnyUri),
XmlTypeCode::QName => Some(Self::QName),
XmlTypeCode::Notation => Some(Self::Notation),
_ => None,
}
}
pub fn to_type_code(&self) -> XmlTypeCode {
match self {
Self::String => XmlTypeCode::String,
Self::Boolean => XmlTypeCode::Boolean,
Self::Decimal => XmlTypeCode::Decimal,
Self::Float => XmlTypeCode::Float,
Self::Double => XmlTypeCode::Double,
Self::Duration => XmlTypeCode::Duration,
Self::DateTime => XmlTypeCode::DateTime,
Self::Time => XmlTypeCode::Time,
Self::Date => XmlTypeCode::Date,
Self::GYearMonth => XmlTypeCode::GYearMonth,
Self::GYear => XmlTypeCode::GYear,
Self::GMonthDay => XmlTypeCode::GMonthDay,
Self::GDay => XmlTypeCode::GDay,
Self::GMonth => XmlTypeCode::GMonth,
Self::HexBinary => XmlTypeCode::HexBinary,
Self::Base64Binary => XmlTypeCode::Base64Binary,
Self::AnyUri => XmlTypeCode::AnyUri,
Self::QName => XmlTypeCode::QName,
Self::Notation => XmlTypeCode::Notation,
}
}
pub fn local_name(&self) -> &'static str {
match self {
Self::String => "string",
Self::Boolean => "boolean",
Self::Decimal => "decimal",
Self::Float => "float",
Self::Double => "double",
Self::Duration => "duration",
Self::DateTime => "dateTime",
Self::Time => "time",
Self::Date => "date",
Self::GYearMonth => "gYearMonth",
Self::GYear => "gYear",
Self::GMonthDay => "gMonthDay",
Self::GDay => "gDay",
Self::GMonth => "gMonth",
Self::HexBinary => "hexBinary",
Self::Base64Binary => "base64Binary",
Self::AnyUri => "anyURI",
Self::QName => "QName",
Self::Notation => "NOTATION",
}
}
pub fn is_numeric(&self) -> bool {
matches!(self, Self::Decimal | Self::Float | Self::Double)
}
pub fn all() -> impl Iterator<Item = PrimitiveTypeCode> {
[
Self::String,
Self::Boolean,
Self::Decimal,
Self::Float,
Self::Double,
Self::Duration,
Self::DateTime,
Self::Time,
Self::Date,
Self::GYearMonth,
Self::GYear,
Self::GMonthDay,
Self::GDay,
Self::GMonth,
Self::HexBinary,
Self::Base64Binary,
Self::AnyUri,
Self::QName,
Self::Notation,
]
.into_iter()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum ValueKind {
#[default]
Atomic,
List,
Union,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_xml_type_code_ordering() {
assert_eq!(XmlTypeCode::None as u8, 0);
assert_eq!(XmlTypeCode::Item as u8, 1);
assert_eq!(XmlTypeCode::Node as u8, 2);
assert_eq!(XmlTypeCode::AnyType as u8, 10);
assert_eq!(XmlTypeCode::AnySimpleType as u8, 11);
assert_eq!(XmlTypeCode::AnyAtomicType as u8, 12);
assert_eq!(XmlTypeCode::UntypedAtomic as u8, 13);
assert_eq!(XmlTypeCode::String as u8, 14);
assert_eq!(XmlTypeCode::Boolean as u8, 24);
assert_eq!(XmlTypeCode::Decimal as u8, 25);
assert_eq!(XmlTypeCode::Duration as u8, 41);
assert_eq!(XmlTypeCode::DateTime as u8, 42);
assert_eq!(XmlTypeCode::HexBinary as u8, 53);
assert_eq!(XmlTypeCode::AnyUri as u8, 55);
assert_eq!(XmlTypeCode::QName as u8, 56);
assert_eq!(XmlTypeCode::Notation as u8, 57);
assert_eq!(XmlTypeCode::NmTokens as u8, 58);
assert_eq!(XmlTypeCode::IdRefs as u8, 59);
assert_eq!(XmlTypeCode::Entities as u8, 60);
}
#[test]
fn test_xml_type_code_is_node() {
assert!(XmlTypeCode::Node.is_node());
assert!(XmlTypeCode::Document.is_node());
assert!(XmlTypeCode::Element.is_node());
assert!(XmlTypeCode::Attribute.is_node());
assert!(XmlTypeCode::Text.is_node());
assert!(XmlTypeCode::Comment.is_node());
assert!(XmlTypeCode::ProcessingInstruction.is_node());
assert!(XmlTypeCode::Namespace.is_node());
assert!(!XmlTypeCode::String.is_node());
assert!(!XmlTypeCode::Integer.is_node());
assert!(!XmlTypeCode::AnyType.is_node());
}
#[test]
fn test_xml_type_code_is_atomic() {
assert!(XmlTypeCode::String.is_atomic());
assert!(XmlTypeCode::Integer.is_atomic());
assert!(XmlTypeCode::DateTime.is_atomic());
assert!(XmlTypeCode::UntypedAtomic.is_atomic());
assert!(XmlTypeCode::Boolean.is_atomic());
assert!(!XmlTypeCode::NmTokens.is_atomic());
assert!(!XmlTypeCode::IdRefs.is_atomic());
assert!(!XmlTypeCode::Entities.is_atomic());
assert!(!XmlTypeCode::None.is_atomic());
assert!(!XmlTypeCode::Node.is_atomic());
assert!(!XmlTypeCode::AnyType.is_atomic());
assert!(!XmlTypeCode::AnySimpleType.is_atomic());
}
#[test]
fn test_xml_type_code_is_list() {
assert!(XmlTypeCode::NmTokens.is_list());
assert!(XmlTypeCode::IdRefs.is_list());
assert!(XmlTypeCode::Entities.is_list());
assert!(!XmlTypeCode::NmToken.is_list());
assert!(!XmlTypeCode::IdRef.is_list());
assert!(!XmlTypeCode::Entity.is_list());
assert!(!XmlTypeCode::String.is_list());
}
#[test]
fn test_xml_type_code_is_numeric() {
assert!(XmlTypeCode::Decimal.is_numeric());
assert!(XmlTypeCode::Integer.is_numeric());
assert!(XmlTypeCode::Float.is_numeric());
assert!(XmlTypeCode::Double.is_numeric());
assert!(XmlTypeCode::Long.is_numeric());
assert!(XmlTypeCode::UnsignedByte.is_numeric());
assert!(!XmlTypeCode::String.is_numeric());
assert!(!XmlTypeCode::Boolean.is_numeric());
assert!(!XmlTypeCode::DateTime.is_numeric());
}
#[test]
fn test_xml_type_code_is_date_time() {
assert!(XmlTypeCode::DateTime.is_date_time());
assert!(XmlTypeCode::Date.is_date_time());
assert!(XmlTypeCode::Time.is_date_time());
assert!(XmlTypeCode::Duration.is_date_time());
assert!(XmlTypeCode::GYear.is_date_time());
assert!(XmlTypeCode::YearMonthDuration.is_date_time());
assert!(XmlTypeCode::DayTimeDuration.is_date_time());
assert!(XmlTypeCode::DateTimeStamp.is_date_time());
assert!(!XmlTypeCode::String.is_date_time());
assert!(!XmlTypeCode::Integer.is_date_time());
}
#[test]
fn test_xml_type_code_is_xsd11() {
assert!(XmlTypeCode::AnyAtomicType.is_xsd11());
assert!(XmlTypeCode::YearMonthDuration.is_xsd11());
assert!(XmlTypeCode::DayTimeDuration.is_xsd11());
assert!(XmlTypeCode::DateTimeStamp.is_xsd11());
assert!(!XmlTypeCode::String.is_xsd11());
assert!(!XmlTypeCode::DateTime.is_xsd11());
assert!(!XmlTypeCode::Duration.is_xsd11());
}
#[test]
fn test_xml_type_code_list_item_type() {
assert_eq!(
XmlTypeCode::NmTokens.list_item_type(),
Some(XmlTypeCode::NmToken)
);
assert_eq!(
XmlTypeCode::IdRefs.list_item_type(),
Some(XmlTypeCode::IdRef)
);
assert_eq!(
XmlTypeCode::Entities.list_item_type(),
Some(XmlTypeCode::Entity)
);
assert_eq!(XmlTypeCode::String.list_item_type(), None);
}
#[test]
fn test_xml_type_code_local_name() {
assert_eq!(XmlTypeCode::String.local_name(), Some("string"));
assert_eq!(XmlTypeCode::Integer.local_name(), Some("integer"));
assert_eq!(XmlTypeCode::DateTime.local_name(), Some("dateTime"));
assert_eq!(XmlTypeCode::AnyUri.local_name(), Some("anyURI"));
assert_eq!(XmlTypeCode::QName.local_name(), Some("QName"));
assert_eq!(XmlTypeCode::NmToken.local_name(), Some("NMTOKEN"));
assert_eq!(XmlTypeCode::NmTokens.local_name(), Some("NMTOKENS"));
assert_eq!(XmlTypeCode::None.local_name(), None);
assert_eq!(XmlTypeCode::Element.local_name(), None);
}
#[test]
fn test_xml_type_code_from_local_name() {
assert_eq!(
XmlTypeCode::from_local_name("string"),
Some(XmlTypeCode::String)
);
assert_eq!(
XmlTypeCode::from_local_name("integer"),
Some(XmlTypeCode::Integer)
);
assert_eq!(
XmlTypeCode::from_local_name("dateTime"),
Some(XmlTypeCode::DateTime)
);
assert_eq!(
XmlTypeCode::from_local_name("anyURI"),
Some(XmlTypeCode::AnyUri)
);
assert_eq!(
XmlTypeCode::from_local_name("QName"),
Some(XmlTypeCode::QName)
);
assert_eq!(
XmlTypeCode::from_local_name("NMTOKEN"),
Some(XmlTypeCode::NmToken)
);
assert_eq!(
XmlTypeCode::from_local_name("NMTOKENS"),
Some(XmlTypeCode::NmTokens)
);
assert_eq!(XmlTypeCode::from_local_name("unknown"), None);
}
#[test]
fn test_xml_type_code_roundtrip() {
for code_val in 10..=60u8 {
let code: XmlTypeCode = unsafe { std::mem::transmute(code_val) };
if let Some(name) = code.local_name() {
assert_eq!(
XmlTypeCode::from_local_name(name),
Some(code),
"Round-trip failed for {:?}",
code
);
}
}
}
#[test]
fn test_primitive_type_code_count() {
assert_eq!(PrimitiveTypeCode::all().count(), 19);
}
#[test]
fn test_primitive_type_code_from_type_code() {
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::String),
Some(PrimitiveTypeCode::String)
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::NormalizedString),
Some(PrimitiveTypeCode::String)
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::Token),
Some(PrimitiveTypeCode::String)
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::NCName),
Some(PrimitiveTypeCode::String)
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::Decimal),
Some(PrimitiveTypeCode::Decimal)
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::Integer),
Some(PrimitiveTypeCode::Decimal)
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::Long),
Some(PrimitiveTypeCode::Decimal)
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::UnsignedInt),
Some(PrimitiveTypeCode::Decimal)
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::Duration),
Some(PrimitiveTypeCode::Duration)
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::YearMonthDuration),
Some(PrimitiveTypeCode::Duration)
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::DayTimeDuration),
Some(PrimitiveTypeCode::Duration)
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::DateTime),
Some(PrimitiveTypeCode::DateTime)
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::DateTimeStamp),
Some(PrimitiveTypeCode::DateTime)
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::Boolean),
Some(PrimitiveTypeCode::Boolean)
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::Float),
Some(PrimitiveTypeCode::Float)
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::Double),
Some(PrimitiveTypeCode::Double)
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::HexBinary),
Some(PrimitiveTypeCode::HexBinary)
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::Base64Binary),
Some(PrimitiveTypeCode::Base64Binary)
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::AnyUri),
Some(PrimitiveTypeCode::AnyUri)
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::QName),
Some(PrimitiveTypeCode::QName)
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::Notation),
Some(PrimitiveTypeCode::Notation)
);
assert_eq!(PrimitiveTypeCode::from_type_code(XmlTypeCode::None), None);
assert_eq!(PrimitiveTypeCode::from_type_code(XmlTypeCode::Node), None);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::AnyType),
None
);
assert_eq!(
PrimitiveTypeCode::from_type_code(XmlTypeCode::NmTokens),
None
);
}
#[test]
fn test_primitive_type_code_to_type_code() {
for prim in PrimitiveTypeCode::all() {
let code = prim.to_type_code();
assert_eq!(
PrimitiveTypeCode::from_type_code(code),
Some(prim),
"Round-trip failed for {:?}",
prim
);
}
}
#[test]
fn test_primitive_type_code_local_name() {
assert_eq!(PrimitiveTypeCode::String.local_name(), "string");
assert_eq!(PrimitiveTypeCode::Boolean.local_name(), "boolean");
assert_eq!(PrimitiveTypeCode::Decimal.local_name(), "decimal");
assert_eq!(PrimitiveTypeCode::DateTime.local_name(), "dateTime");
assert_eq!(PrimitiveTypeCode::AnyUri.local_name(), "anyURI");
assert_eq!(PrimitiveTypeCode::QName.local_name(), "QName");
assert_eq!(PrimitiveTypeCode::Notation.local_name(), "NOTATION");
}
#[test]
fn test_value_kind_default() {
assert_eq!(ValueKind::default(), ValueKind::Atomic);
}
#[test]
fn test_value_kind_variants() {
assert_ne!(ValueKind::Atomic, ValueKind::List);
assert_ne!(ValueKind::Atomic, ValueKind::Union);
assert_ne!(ValueKind::List, ValueKind::Union);
}
}