git-next/crates/repo-actor/src/load.rs
Paul Campbell f2af849d0b
All checks were successful
Rust / build (push) Successful in 1m8s
ci/woodpecker/push/cron-docker-builder Pipeline was successful
ci/woodpecker/push/push-next Pipeline was successful
ci/woodpecker/push/tag-created Pipeline was successful
refactor(forge): rename gitforge crate as forge
2024-05-23 16:04:38 +01:00

48 lines
1.4 KiB
Rust

use git_next_config::{self as config, BranchName, RepoConfig};
use git_next_forge as forge;
use git_next_git::RepoDetails;
use tracing::error;
pub async fn load(details: &RepoDetails, forge: &forge::Forge) -> Result<RepoConfig, Error> {
let contents = forge
.file_contents_get(&details.branch, ".git-next.toml")
.await?;
let config = RepoConfig::load(&contents)?;
let config = validate(config, forge).await?;
Ok(config)
}
#[derive(Debug, derive_more::From, derive_more::Display)]
pub enum Error {
File(forge::file::Error),
Config(config::server::Error),
Toml(toml::de::Error),
Forge(forge::branch::Error),
BranchNotFound(BranchName),
}
pub async fn validate(config: RepoConfig, forge: &forge::Forge) -> Result<RepoConfig, Error> {
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)
}