use std::fs;
use std::sync::Arc;
use crate::config::{ConfigFile, ConfigScope, ConfigSet};
use crate::error::Result;
use crate::repo::Repository;
#[derive(Debug, Copy, Clone)]
pub struct ConfigHandle<'repo> {
repo: &'repo Repository,
}
impl<'repo> ConfigHandle<'repo> {
#[inline]
#[must_use]
pub fn new(repo: &'repo Repository) -> Self {
Self { repo }
}
#[inline]
#[must_use]
pub fn repository(&self) -> &'repo Repository {
self.repo
}
#[inline]
pub fn get(&self, key: &str) -> Result<Option<String>> {
Ok(self.snapshot()?.get(key))
}
#[inline]
pub fn set_local(&self, key: &str, value: &str) -> Result<()> {
let path = crate::repo::local_config_write_path(self.repo.git_dir());
let content = fs::read_to_string(&path).unwrap_or_default();
let mut file = ConfigFile::parse(&path, &content, ConfigScope::Local)?;
file.set(key, value)?;
file.write()?;
self.repo.reload_config()
}
pub fn unset_local(&self, key: &str) -> Result<()> {
let path = crate::repo::local_config_write_path(self.repo.git_dir());
let content = fs::read_to_string(&path).unwrap_or_default();
let mut file = ConfigFile::parse(&path, &content, ConfigScope::Local)?;
file.unset(key)?;
file.write()?;
self.repo.reload_config()
}
pub fn remove_local_section(&self, section: &str) -> Result<()> {
let path = crate::repo::local_config_write_path(self.repo.git_dir());
let content = fs::read_to_string(&path).unwrap_or_default();
let mut file = ConfigFile::parse(&path, &content, ConfigScope::Local)?;
file.remove_section(section)?;
file.write()?;
self.repo.reload_config()
}
#[inline]
pub fn snapshot(&self) -> Result<Arc<ConfigSet>> {
self.repo.config()
}
}