use crate::adopter::*;
use toml::Value;
impl ValuePath for Value {
fn get_index<'tr>(&'tr self, i: usize) -> Option<&'tr Self>
{
self.get(i)
}
fn get_key<'tr>(&'tr self, k: &str) -> Option<&'tr Self>
{
self.get(k)
}
fn get_index_mut<'tr>(&'tr mut self, i: usize) -> Option<&'tr mut Self>
{
self.get_mut(i)
}
fn get_key_mut<'tr>(&'tr mut self, k: &str) -> Option<&'tr mut Self>
{
self.get_mut(k)
}
}
impl ValueReader for Value {
fn get_str<'tr>(&'tr self, rhs: &'tr str) -> &'tr str {
match self.as_str() {
Some(val) => val,
None => rhs,
}
}
fn get_string(&self, rhs: String) -> String {
match self {
Value::String(s) => s.to_string(),
Value::Integer(i) if rhs == "0" => i.to_string(),
Value::Float(f) if rhs == "0.0" => f.to_string(),
Value::Boolean(tf) if rhs == "bool" => tf.to_string(),
Value::Array(_) if rhs == "[]" => self.to_string(),
Value::Table(_) if rhs == "{}" => self.to_string(),
_ if rhs.is_empty() => self.to_string(),
_ => rhs
}
}
fn get_i64(&self, rhs: i64) -> i64 {
match self {
Value::Integer(i) => *i,
Value::String(s) => s.parse().unwrap_or(rhs),
Value::Boolean(tf) => if *tf { 1 } else { 0 },
_ => rhs
}
}
fn get_f64(&self, rhs: f64) -> f64 {
match self {
Value::Float(f) => *f,
Value::String(s) => s.parse().unwrap_or(rhs),
_ => rhs
}
}
fn get_bool(&self, rhs: bool) -> bool {
match self {
Value::Boolean(tf) => *tf,
Value::Integer(i) => *i != 0,
Value::String(s) => s.parse().unwrap_or(rhs),
_ => rhs
}
}
}
impl ValueWriter for Value {
fn put_value<T>(&mut self, rhs: T) -> &mut Self where Value: From<T> , T: ScalarValue {
*self = Value::from(rhs);
self
}
fn push_object<K: ToString, T>(&mut self, key: K, val: T) -> &mut Self where Value: From<T> {
if !self.is_table() {
*self = Value::Table(toml::Table::new());
}
if let Some(v) = self.as_table_mut() {
v.insert(key.to_string(), Value::from(val));
}
self
}
fn push_array<T>(&mut self, val: T) -> &mut Self where Value: From<T> {
if !self.is_array() {
*self = Value::Array(toml::value::Array::new());
}
if let Some(v) = self.as_array_mut() {
v.push(Value::from(val));
}
self
}
}