railwayapp 5.23.0

Interact with Railway via CLI
use crate::{
    commands::queries::{
        RailwayProject,
        project::{ProjectProjectEnvironmentsEdges, ProjectProjectEnvironmentsEdgesNode},
    },
    errors::RailwayError,
};
use anyhow::{Result, bail};

pub fn get_matched_environment(
    project: &RailwayProject,
    environment: String,
) -> Result<ProjectProjectEnvironmentsEdgesNode> {
    Ok(get_matched_environment_edge(project, environment)?
        .node
        .clone())
}

pub fn get_matched_environment_edge<'a>(
    project: &'a RailwayProject,
    environment: String,
) -> Result<&'a ProjectProjectEnvironmentsEdges> {
    let environment = project
        .environments
        .edges
        .iter()
        .find(|env| env.node.name == environment || env.node.id == environment)
        .ok_or_else(|| RailwayError::EnvironmentNotFound(environment))?;

    ensure_environment_accessible(&environment.node)?;

    Ok(environment)
}

pub fn ensure_environment_accessible(
    environment: &ProjectProjectEnvironmentsEdgesNode,
) -> Result<()> {
    if !environment.can_access {
        bail!(RailwayError::EnvironmentRestricted(
            environment.name.clone()
        ));
    }

    Ok(())
}