frontend-utils: Add warning capable casting methods
This commit is contained in:
parent
c95d02339e
commit
de003e12e7
|
@ -207,68 +207,45 @@ pub trait ReadExt<'a> {
|
|||
}
|
||||
|
||||
fn parse_from_str<T: FromStr>(&'a self, cx: &mut ParseContext, key: &'static str) -> Option<T> {
|
||||
cx.push_key(key);
|
||||
let mut result = None;
|
||||
|
||||
let res = if let Some(item) = self.get_impl(key) {
|
||||
if let Some(str) = item.as_str() {
|
||||
cx.push_key(key);
|
||||
if let Some(str) = self.get_impl(key).and_then(|item| item.as_str_or_warn(cx)) {
|
||||
if let Ok(value) = str.parse::<T>() {
|
||||
Some(value)
|
||||
result = Some(value)
|
||||
} else {
|
||||
cx.unsupported_value(str.to_owned());
|
||||
None
|
||||
}
|
||||
} else {
|
||||
cx.unexpected_type("string", item.type_name());
|
||||
None
|
||||
}
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
cx.pop_key();
|
||||
|
||||
res
|
||||
result
|
||||
}
|
||||
|
||||
fn get_bool(&'a self, cx: &mut ParseContext, key: &'static str) -> Option<bool> {
|
||||
cx.push_key(key);
|
||||
|
||||
let res = if let Some(item) = self.get_impl(key) {
|
||||
if let Some(value) = item.as_bool() {
|
||||
Some(value)
|
||||
} else {
|
||||
cx.unexpected_type("boolean", item.type_name());
|
||||
None
|
||||
}
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
let result = self.get_impl(key).and_then(|x| x.as_bool_or_warn(cx));
|
||||
cx.pop_key();
|
||||
|
||||
res
|
||||
result
|
||||
}
|
||||
|
||||
fn get_float(&'a self, cx: &mut ParseContext, key: &'static str) -> Option<f64> {
|
||||
cx.push_key(key);
|
||||
|
||||
let res = if let Some(item) = self.get_impl(key) {
|
||||
if let Some(value) = item.as_float() {
|
||||
Some(value)
|
||||
} else {
|
||||
cx.unexpected_type("float", item.type_name());
|
||||
None
|
||||
}
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
let result = self.get_impl(key).and_then(|x| x.as_float_or_warn(cx));
|
||||
cx.pop_key();
|
||||
|
||||
res
|
||||
result
|
||||
}
|
||||
}
|
||||
|
||||
/// Extension trait to provide casting methods with warning capabilities.
|
||||
pub trait ItemExt<'a> {
|
||||
fn as_str_or_warn(&'a self, cx: &mut ParseContext) -> Option<&'a str>;
|
||||
fn as_bool_or_warn(&self, cx: &mut ParseContext) -> Option<bool>;
|
||||
fn as_float_or_warn(&self, cx: &mut ParseContext) -> Option<f64>;
|
||||
}
|
||||
|
||||
// Implementations for toml_edit types.
|
||||
|
||||
impl<'a> ReadExt<'a> for DocumentMut {
|
||||
|
@ -294,3 +271,35 @@ impl<'a> ReadExt<'a> for dyn TableLike + 'a {
|
|||
self.get(key)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> ItemExt<'a> for Item {
|
||||
fn as_bool_or_warn(&self, cx: &mut ParseContext) -> Option<bool> {
|
||||
if let Some(value) = self.as_bool() {
|
||||
return Some(value);
|
||||
} else {
|
||||
cx.unexpected_type("boolean", self.type_name());
|
||||
}
|
||||
|
||||
None
|
||||
}
|
||||
|
||||
fn as_float_or_warn(&self, cx: &mut ParseContext) -> Option<f64> {
|
||||
if let Some(value) = self.as_float() {
|
||||
return Some(value);
|
||||
} else {
|
||||
cx.unexpected_type("float", self.type_name());
|
||||
}
|
||||
|
||||
None
|
||||
}
|
||||
|
||||
fn as_str_or_warn(&'a self, cx: &mut ParseContext) -> Option<&'a str> {
|
||||
if let Some(value) = self.as_str() {
|
||||
return Some(value);
|
||||
} else {
|
||||
cx.unexpected_type("string", self.type_name());
|
||||
}
|
||||
|
||||
None
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue