pub struct Section(/* private fields */);Expand description
A section in a systemd unit file (e.g., [Unit], [Service])
Implementations§
Source§impl Section
impl Section
Sourcepub fn get_all(&self, key: &str) -> Vec<String>
pub fn get_all(&self, key: &str) -> Vec<String>
Get all values for a key (systemd allows multiple entries with the same key)
Sourcepub fn set(&mut self, key: &str, value: &str)
pub fn set(&mut self, key: &str, value: &str)
Set a value for a key (replaces the first occurrence or adds if it doesn’t exist)
Sourcepub fn add(&mut self, key: &str, value: &str)
pub fn add(&mut self, key: &str, value: &str)
Add a value for a key (appends even if the key already exists)
Sourcepub fn insert_at(&mut self, index: usize, key: &str, value: &str)
pub fn insert_at(&mut self, index: usize, key: &str, value: &str)
Insert a value at a specific position (index is among entries only, not all nodes)
If the index is greater than or equal to the number of entries, the entry will be appended at the end.
§Example
let input = r#"[Unit]
Description=Test Service
After=network.target
"#;
let unit = SystemdUnit::from_str(input).unwrap();
{
let mut section = unit.get_section("Unit").unwrap();
section.insert_at(1, "Wants", "foo.service");
}
let section = unit.get_section("Unit").unwrap();
let entries: Vec<_> = section.entries().collect();
assert_eq!(entries[0].key(), Some("Description".to_string()));
assert_eq!(entries[1].key(), Some("Wants".to_string()));
assert_eq!(entries[2].key(), Some("After".to_string()));Sourcepub fn insert_before(&mut self, existing_key: &str, key: &str, value: &str)
pub fn insert_before(&mut self, existing_key: &str, key: &str, value: &str)
Insert a value before the first entry with the specified key
If no entry with the specified key exists, this method does nothing.
§Example
let input = r#"[Unit]
Description=Test Service
After=network.target
"#;
let unit = SystemdUnit::from_str(input).unwrap();
{
let mut section = unit.get_section("Unit").unwrap();
section.insert_before("After", "Wants", "foo.service");
}
let section = unit.get_section("Unit").unwrap();
let entries: Vec<_> = section.entries().collect();
assert_eq!(entries[0].key(), Some("Description".to_string()));
assert_eq!(entries[1].key(), Some("Wants".to_string()));
assert_eq!(entries[2].key(), Some("After".to_string()));Sourcepub fn insert_after(&mut self, existing_key: &str, key: &str, value: &str)
pub fn insert_after(&mut self, existing_key: &str, key: &str, value: &str)
Insert a value after the first entry with the specified key
If no entry with the specified key exists, this method does nothing.
§Example
let input = r#"[Unit]
Description=Test Service
After=network.target
"#;
let unit = SystemdUnit::from_str(input).unwrap();
{
let mut section = unit.get_section("Unit").unwrap();
section.insert_after("Description", "Wants", "foo.service");
}
let section = unit.get_section("Unit").unwrap();
let entries: Vec<_> = section.entries().collect();
assert_eq!(entries[0].key(), Some("Description".to_string()));
assert_eq!(entries[1].key(), Some("Wants".to_string()));
assert_eq!(entries[2].key(), Some("After".to_string()));Sourcepub fn set_list(&mut self, key: &str, values: &[&str])
pub fn set_list(&mut self, key: &str, values: &[&str])
Set a space-separated list value for a key
This is a convenience method for setting list-type directives
(e.g., Wants=, After=). The values will be joined with spaces.
§Example
section.set_list("Wants", &["foo.service", "bar.service"]);
// Results in: Wants=foo.service bar.serviceSourcepub fn get_list(&self, key: &str) -> Vec<String>
pub fn get_list(&self, key: &str) -> Vec<String>
Get a value parsed as a space-separated list
This is a convenience method for getting list-type directives. If the key doesn’t exist, returns an empty vector.
Sourcepub fn get_bool(&self, key: &str) -> Option<bool>
pub fn get_bool(&self, key: &str) -> Option<bool>
Get a value parsed as a boolean
Returns None if the key doesn’t exist or if the value is not a valid boolean.
§Example
let unit = SystemdUnit::from_str("[Service]\nRemainAfterExit=yes\n").unwrap();
let section = unit.get_section("Service").unwrap();
assert_eq!(section.get_bool("RemainAfterExit"), Some(true));Sourcepub fn set_bool(&mut self, key: &str, value: bool)
pub fn set_bool(&mut self, key: &str, value: bool)
Set a boolean value for a key
This is a convenience method that formats the boolean as “yes” or “no”.
§Example
let unit = SystemdUnit::from_str("[Service]\n").unwrap();
let mut section = unit.get_section("Service").unwrap();
section.set_bool("RemainAfterExit", true);
assert_eq!(section.get("RemainAfterExit"), Some("yes".to_string()));Sourcepub fn remove_all(&mut self, key: &str)
pub fn remove_all(&mut self, key: &str)
Remove all entries with the given key
Sourcepub fn remove_value(&mut self, key: &str, value_to_remove: &str)
pub fn remove_value(&mut self, key: &str, value_to_remove: &str)
Remove a specific value from entries with the given key
This is useful for multi-value fields like After=, Wants=, etc.
It handles space-separated values within a single entry and removes
entire entries if they only contain the target value.
§Example
let input = r#"[Unit]
After=network.target syslog.target
After=remote-fs.target
"#;
let unit = SystemdUnit::from_str(input).unwrap();
{
let mut section = unit.sections().next().unwrap();
section.remove_value("After", "syslog.target");
}
let section = unit.sections().next().unwrap();
let all_after = section.get_all("After");
assert_eq!(all_after.len(), 2);
assert_eq!(all_after[0], "network.target");
assert_eq!(all_after[1], "remote-fs.target");Sourcepub fn remove_entries_where<F>(&mut self, predicate: F)
pub fn remove_entries_where<F>(&mut self, predicate: F)
Remove entries matching a predicate
This provides a flexible way to remove entries based on arbitrary conditions.
The predicate receives the entry’s key and value and should return true for
entries that should be removed.
§Example
let input = r#"[Unit]
After=network.target syslog.target
Wants=foo.service
After=remote-fs.target
"#;
let unit = SystemdUnit::from_str(input).unwrap();
{
let mut section = unit.sections().next().unwrap();
section.remove_entries_where(|key, value| {
key == "After" && value.split_whitespace().any(|v| v == "syslog.target")
});
}
let section = unit.sections().next().unwrap();
let all_after = section.get_all("After");
assert_eq!(all_after.len(), 1);
assert_eq!(all_after[0], "remote-fs.target");
assert_eq!(section.get("Wants"), Some("foo.service".to_string()));Sourcepub fn syntax(&self) -> &SyntaxNode<Lang>
pub fn syntax(&self) -> &SyntaxNode<Lang>
Get the raw syntax node