// use actix::prelude::*; use tracing::{error, info}; use git_next_config as config; use git_next_forge as forge; 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, forge: forge::Forge) { info!("Loading .git-next.toml from repo"); let repo_config = match load(&repo_details, &forge).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)); } async fn load( details: &git::RepoDetails, forge: &forge::Forge, ) -> Result { let contents = forge .file_contents_get(&details.branch, ".git-next.toml") .await?; let config = config::RepoConfig::load(&contents)?; let config = validate(config, forge).await?; Ok(config) } #[derive(Debug, derive_more::From, derive_more::Display)] pub enum Error { File(git::file::Error), Config(config::server::Error), Toml(toml::de::Error), Forge(git::branch::Error), BranchNotFound(config::BranchName), } pub async fn validate( config: config::RepoConfig, forge: &forge::Forge, ) -> Result { let branches = forge.branches_get_all().await.map_err(|e| { error!(?e, "Failed to list branches"); Error::Forge(e) })?; 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) }