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
use crate::yaml::{Mapping, Number, Sequence, String, Value};
/// An enum which helps to externally discriminate the interior type of a
/// [`Value`].
///
/// See [`Value::into_any`] or [`Value::as_any`].
///
/// [`Value::into_any`]: crate::yaml::Value::into_any
/// [`Value::as_any`]: crate::yaml::Value::as_any
#[derive(Debug)]
#[non_exhaustive]
pub enum Any<'a> {
/// A null value.
Null,
/// An boolean value.
Bool(bool),
/// A number value.
Number(Number<'a>),
/// A string value.
String(String<'a>),
/// A [`Mapping`] value.
Mapping(Mapping<'a>),
/// A [`Sequence`] value.
Sequence(Sequence<'a>),
/// A raw unrecognized value.
Raw(Value<'a>),
}
impl<'a> Any<'a> {
/// Test if [`Any`] is null.
///
/// # Examples
///
/// ```
/// use anyhow::Context;
/// use bstr::ByteSlice;
/// use nondestructive::yaml;
///
/// let doc = yaml::from_slice("null")?;
/// let doc = doc.as_ref();
///
/// assert!(doc.as_any().is_null());
/// # Ok::<_, anyhow::Error>(())
/// ```
#[must_use]
pub fn is_null(self) -> bool {
matches!(self, Self::Null)
}
/// Coerce [`Any`] into a bool.
///
/// # Examples
///
/// ```
/// use anyhow::Context;
/// use bstr::ByteSlice;
/// use nondestructive::yaml;
///
/// let doc = yaml::from_slice("true")?;
/// let doc = doc.as_ref();
///
/// let value = doc.as_any().into_bool().context("expected bool")?;
/// assert_eq!(value, true);
/// # Ok::<_, anyhow::Error>(())
/// ```
#[must_use]
pub fn into_bool(self) -> Option<bool> {
match self {
Self::Bool(value) => Some(value),
_ => None,
}
}
/// Coerce [`Any`] into a string.
///
/// # Examples
///
/// ```
/// use anyhow::Context;
/// use bstr::ByteSlice;
/// use nondestructive::yaml;
///
/// let doc = yaml::from_slice(r#""Hello World""#)?;
/// let doc = doc.as_ref();
///
/// let value = doc.as_any().into_string().context("expected string")?;
/// assert_eq!(value.to_str(), Ok("Hello World"));
/// # Ok::<_, anyhow::Error>(())
/// ```
#[must_use]
pub fn into_string(self) -> Option<String<'a>> {
match self {
Self::String(value) => Some(value),
_ => None,
}
}
/// Coerce [`Any`] into a string.
///
/// # Examples
///
/// ```
/// use anyhow::Context;
/// use bstr::ByteSlice;
/// use nondestructive::yaml;
///
/// let doc = yaml::from_slice("42")?;
/// let doc = doc.as_ref();
///
/// let value = doc.as_any().into_number().context("expected number")?;
/// assert_eq!(value.as_u32(), Some(42));
/// # Ok::<_, anyhow::Error>(())
/// ```
#[must_use]
pub fn into_number(self) -> Option<Number<'a>> {
match self {
Self::Number(value) => Some(value),
_ => None,
}
}
}