xsd_types/lexical/
boolean.rs

1use super::lexical_form;
2use std::borrow::{Borrow, ToOwned};
3use std::cmp::Ordering;
4use std::fmt;
5use std::hash::{Hash, Hasher};
6
7lexical_form! {
8	/// Boolean.
9	///
10	/// See: <https://www.w3.org/TR/xmlschema-2/#boolean>
11	ty: Boolean,
12
13	/// Owned boolean.
14	///
15	/// See: <https://www.w3.org/TR/xmlschema-2/#boolean>
16	buffer: BooleanBuf,
17
18	/// Creates a new boolean from a string.
19	///
20	/// If the input string is ot a [valid XSD boolean](https://www.w3.org/TR/xmlschema-2/#boolean),
21	/// an [`InvalidBoolean`] error is returned.
22	new,
23
24	/// Creates a new boolean from a string without checking it.
25	///
26	/// # Safety
27	///
28	/// The input string must be a [valid XSD boolean](https://www.w3.org/TR/xmlschema-2/#boolean).
29	new_unchecked,
30
31	value: crate::Boolean,
32	error: InvalidBoolean,
33	as_ref: as_boolean,
34	parent_forms: {}
35}
36
37impl Boolean {
38	pub fn value(&self) -> crate::Boolean {
39		crate::Boolean(matches!(&self.0, b"true" | b"1"))
40	}
41}
42
43impl PartialEq for Boolean {
44	fn eq(&self, other: &Self) -> bool {
45		self.value() == other.value()
46	}
47}
48
49impl Eq for Boolean {}
50
51impl Hash for Boolean {
52	fn hash<H: Hasher>(&self, state: &mut H) {
53		self.value().hash(state)
54	}
55}
56
57impl Ord for Boolean {
58	fn cmp(&self, other: &Self) -> Ordering {
59		self.value().cmp(&other.value())
60	}
61}
62
63impl PartialOrd for Boolean {
64	fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
65		Some(self.cmp(other))
66	}
67}
68
69impl From<bool> for BooleanBuf {
70	fn from(b: bool) -> Self {
71		if b {
72			unsafe { BooleanBuf::new_unchecked(vec![b't', b'r', b'u', b'e']) }
73		} else {
74			unsafe { BooleanBuf::new_unchecked(vec![b'f', b'a', b'l', b's', b'e']) }
75		}
76	}
77}
78
79impl<'a> From<&'a Boolean> for crate::Boolean {
80	fn from(b: &'a Boolean) -> crate::Boolean {
81		b.value()
82	}
83}
84
85impl From<BooleanBuf> for crate::Boolean {
86	fn from(b: BooleanBuf) -> crate::Boolean {
87		b.value()
88	}
89}
90
91impl<'a> From<&'a Boolean> for bool {
92	fn from(b: &'a Boolean) -> bool {
93		b.value().into()
94	}
95}
96
97impl From<BooleanBuf> for bool {
98	fn from(b: BooleanBuf) -> bool {
99		b.value().into()
100	}
101}
102
103fn check_bytes(s: &[u8]) -> bool {
104	matches!(s, b"true" | b"false" | b"0" | b"1")
105}