]>
git.proxmox.com Git - rustc.git/blob - vendor/mdbook/src/utils/toml_ext.rs
1 use toml
::value
::{Table, Value}
;
3 pub(crate) trait TomlExt
{
4 fn read(&self, key
: &str) -> Option
<&Value
>;
5 fn read_mut(&mut self, key
: &str) -> Option
<&mut Value
>;
6 fn insert(&mut self, key
: &str, value
: Value
);
7 fn delete(&mut self, key
: &str) -> Option
<Value
>;
10 impl TomlExt
for Value
{
11 fn read(&self, key
: &str) -> Option
<&Value
> {
12 if let Some((head
, tail
)) = split(key
) {
13 self.get(head
)?
.read(tail
)
19 fn read_mut(&mut self, key
: &str) -> Option
<&mut Value
> {
20 if let Some((head
, tail
)) = split(key
) {
21 self.get_mut(head
)?
.read_mut(tail
)
27 fn insert(&mut self, key
: &str, value
: Value
) {
29 *self = Value
::Table(Table
::new());
32 let table
= self.as_table_mut().expect("unreachable");
34 if let Some((head
, tail
)) = split(key
) {
37 .or_insert_with(|| Value
::Table(Table
::new()))
40 table
.insert(key
.to_string(), value
);
44 fn delete(&mut self, key
: &str) -> Option
<Value
> {
45 if let Some((head
, tail
)) = split(key
) {
46 self.get_mut(head
)?
.delete(tail
)
47 } else if let Some(table
) = self.as_table_mut() {
55 fn split(key
: &str) -> Option
<(&str, &str)> {
56 let ix
= key
.find('
.'
)?
;
58 let (head
, tail
) = key
.split_at(ix
);
59 // splitting will leave the "."
60 let tail
= &tail
[1..];
68 use std
::str::FromStr
;
71 fn read_simple_table() {
73 let value
= Value
::from_str(src
).unwrap();
75 let got
= value
.read("table").unwrap();
77 assert
!(got
.is_table());
81 fn read_nested_item() {
82 let src
= "[table]\nnested=true";
83 let value
= Value
::from_str(src
).unwrap();
85 let got
= value
.read("table.nested").unwrap();
87 assert_eq
!(got
, &Value
::Boolean(true));
91 fn insert_item_at_top_level() {
92 let mut value
= Value
::Table(Table
::default());
93 let item
= Value
::Boolean(true);
95 value
.insert("first", item
.clone());
97 assert_eq
!(value
.get("first").unwrap(), &item
);
101 fn insert_nested_item() {
102 let mut value
= Value
::Table(Table
::default());
103 let item
= Value
::Boolean(true);
105 value
.insert("first.second", item
.clone());
107 let inserted
= value
.read("first.second").unwrap();
108 assert_eq
!(inserted
, &item
);
112 fn delete_a_top_level_item() {
113 let src
= "top = true";
114 let mut value
= Value
::from_str(src
).unwrap();
116 let got
= value
.delete("top").unwrap();
118 assert_eq
!(got
, Value
::Boolean(true));
122 fn delete_a_nested_item() {
123 let src
= "[table]\n nested = true";
124 let mut value
= Value
::from_str(src
).unwrap();
126 let got
= value
.delete("table.nested").unwrap();
128 assert_eq
!(got
, Value
::Boolean(true));