git-next/crates/repo-actor/src/load.rs

76 lines
2.2 KiB
Rust
Raw Normal View History

2024-06-09 10:21:09 +01:00
use std::path::PathBuf;
//
use actix::prelude::*;
use tracing::{error, info};
2024-05-23 16:50:36 +01:00
use git_next_config as config;
use git_next_git as git;
use super::{LoadedConfig, RepoActor};
/// Loads the [RepoConfig] from the `.git-next.toml` file in the repository
#[tracing::instrument(skip_all, fields(branch = %repo_details.branch))]
pub async fn load_file(
repo_details: git::RepoDetails,
addr: Addr<RepoActor>,
open_repository: &dyn git::repository::OpenRepositoryLike,
) {
info!("Loading .git-next.toml from repo");
let repo_config = match load(&repo_details, open_repository).await {
Ok(repo_config) => repo_config,
Err(err) => {
error!(?err, "Failed to load config");
return;
}
};
info!("Loaded .git-next.toml from repo");
addr.do_send(LoadedConfig(repo_config));
}
2024-04-09 10:44:01 +01:00
async fn load(
2024-05-23 16:50:36 +01:00
details: &git::RepoDetails,
open_repository: &dyn git::repository::OpenRepositoryLike,
2024-05-23 16:50:36 +01:00
) -> Result<config::RepoConfig, Error> {
2024-06-09 10:21:09 +01:00
let contents = open_repository.read_file(&details.branch, &PathBuf::from(".git-next.toml"))?;
2024-06-19 07:02:18 +01:00
let config = config::RepoConfig::parse(&contents)?;
let config = validate(config, open_repository).await?;
Ok(config)
2024-04-09 10:44:01 +01:00
}
2024-05-18 22:16:17 +01:00
#[derive(Debug, derive_more::From, derive_more::Display)]
pub enum Error {
2024-05-23 16:50:36 +01:00
File(git::file::Error),
Config(config::server::Error),
2024-05-18 22:16:17 +01:00
Toml(toml::de::Error),
Branch(git::push::Error),
2024-05-23 16:50:36 +01:00
BranchNotFound(config::BranchName),
}
2024-05-23 16:50:36 +01:00
pub async fn validate(
config: config::RepoConfig,
open_repository: &dyn git::repository::OpenRepositoryLike,
2024-05-23 16:50:36 +01:00
) -> Result<config::RepoConfig, Error> {
let branches = open_repository.remote_branches()?;
if !branches
.iter()
.any(|branch| branch == &config.branches().main())
{
return Err(Error::BranchNotFound(config.branches().main()));
}
if !branches
.iter()
.any(|branch| branch == &config.branches().next())
{
return Err(Error::BranchNotFound(config.branches().next()));
}
if !branches
.iter()
.any(|branch| branch == &config.branches().dev())
{
return Err(Error::BranchNotFound(config.branches().dev()));
}
Ok(config)
}