diff --git a/src/cli/install.rs b/src/cli/install.rs index eaedb7400..16757ff69 100644 --- a/src/cli/install.rs +++ b/src/cli/install.rs @@ -1,6 +1,5 @@ use crate::config::ConfigCli; use crate::environment::get_up_to_date_prefix; -use crate::project::manifest::EnvironmentName; use crate::Project; use clap::Parser; use indexmap::IndexMap; @@ -26,10 +25,7 @@ pub struct Args { pub async fn execute(args: Args) -> miette::Result<()> { let project = Project::load_or_else_discover(args.manifest_path.as_deref())?.with_cli_config(args.config); - let environment_name = EnvironmentName::from_arg_or_env_var(args.environment); - let environment = project - .environment(&environment_name) - .ok_or_else(|| miette::miette!("unknown environment '{environment_name}'"))?; + let environment = project.environment_from_name_or_env_var(args.environment)?; get_up_to_date_prefix( &environment, diff --git a/src/cli/list.rs b/src/cli/list.rs index 77b693bca..8e5f3f553 100644 --- a/src/cli/list.rs +++ b/src/cli/list.rs @@ -12,7 +12,6 @@ use serde::Serialize; use uv_distribution::RegistryWheelIndex; use crate::lock_file::{UpdateLockFileOptions, UvResolutionContext}; -use crate::project::manifest::EnvironmentName; use crate::pypi_tags::{get_pypi_tags, is_python_record}; use crate::Project; @@ -107,10 +106,7 @@ where pub async fn execute(args: Args) -> miette::Result<()> { let project = Project::load_or_else_discover(args.manifest_path.as_deref())?; - let environment_name = EnvironmentName::from_arg_or_env_var(args.environment); - let environment = project - .environment(&environment_name) - .ok_or_else(|| miette::miette!("unknown environment '{environment_name}'"))?; + let environment = project.environment_from_name_or_env_var(args.environment)?; let lock_file = project .up_to_date_lock_file(UpdateLockFileOptions { @@ -209,8 +205,8 @@ pub async fn execute(args: Args) -> miette::Result<()> { // print packages as json json_packages(&packages_to_output, args.json_pretty); } else { - if !environment_name.is_default() { - eprintln!("Environment: {}", environment_name.fancy_display()); + if !environment.is_default() { + eprintln!("Environment: {}", environment.name().fancy_display()); } // print packages as table diff --git a/src/cli/shell.rs b/src/cli/shell.rs index f70fbd1da..ac4b4e81d 100644 --- a/src/cli/shell.rs +++ b/src/cli/shell.rs @@ -203,14 +203,11 @@ async fn start_nu_shell( pub async fn execute(args: Args) -> miette::Result<()> { let project = Project::load_or_else_discover(args.manifest_path.as_deref())?.with_cli_config(args.config); - let environment_name = EnvironmentName::from_arg_or_env_var(args.environment); - let environment = project - .environment(&environment_name) - .ok_or_else(|| miette::miette!("unknown environment '{environment_name}'"))?; + let environment = project.environment_from_name_or_env_var(args.environment)?; verify_current_platform_has_required_virtual_packages(&environment).into_diagnostic()?; - let prompt_name = match environment_name { + let prompt_name = match environment.name() { EnvironmentName::Default => project.name().to_string(), EnvironmentName::Named(name) => format!("{}:{}", project.name(), name), }; diff --git a/src/cli/task.rs b/src/cli/task.rs index cb33688ac..089bda46e 100644 --- a/src/cli/task.rs +++ b/src/cli/task.rs @@ -1,10 +1,9 @@ -use crate::project::manifest::{EnvironmentName, FeatureName}; +use crate::project::manifest::FeatureName; use crate::task::{quote, Alias, CmdArgs, Execute, Task, TaskName}; use crate::Project; use clap::Parser; use indexmap::IndexMap; use itertools::Itertools; -use miette::miette; use rattler_conda_types::Platform; use std::error::Error; use std::path::PathBuf; @@ -274,10 +273,8 @@ pub fn execute(args: Args) -> miette::Result<()> { ); } Operation::List(args) => { - let env = EnvironmentName::from_arg_or_env_var(args.environment); - let tasks = project - .environment(&env) - .ok_or(miette!("Environment `{}` not found in project", env))? + let environment = project.environment_from_name_or_env_var(args.environment)?; + let tasks = environment .tasks(Some(Platform::current()), true)? .into_keys() .collect_vec(); diff --git a/src/cli/tree.rs b/src/cli/tree.rs index 3c1e9433c..c156c212d 100644 --- a/src/cli/tree.rs +++ b/src/cli/tree.rs @@ -7,7 +7,6 @@ use itertools::Itertools; use rattler_conda_types::Platform; use crate::lock_file::UpdateLockFileOptions; -use crate::project::manifest::EnvironmentName; use crate::Project; /// Show a tree of project dependencies @@ -70,10 +69,7 @@ static UTF8_SYMBOLS: Symbols = Symbols { pub async fn execute(args: Args) -> miette::Result<()> { let project = Project::load_or_else_discover(args.manifest_path.as_deref())?; - let environment_name = EnvironmentName::from_arg_or_env_var(args.environment); - let environment = project - .environment(&environment_name) - .ok_or_else(|| miette::miette!("unknown environment '{environment_name}'"))?; + let environment = project.environment_from_name_or_env_var(args.environment)?; let lock_file = project .up_to_date_lock_file(UpdateLockFileOptions { lock_file_usage: args.lock_file_usage.into(), @@ -92,8 +88,8 @@ pub async fn execute(args: Args) -> miette::Result<()> { let direct_deps = direct_dependencies(&environment, &platform, &dep_map); - if !environment_name.is_default() { - eprintln!("Environment: {}", environment_name.fancy_display()); + if !environment.is_default() { + eprintln!("Environment: {}", environment.name().fancy_display()); } if args.invert { diff --git a/src/project/manifest/environment.rs b/src/project/manifest/environment.rs index cf1c53e89..680e14a8b 100644 --- a/src/project/manifest/environment.rs +++ b/src/project/manifest/environment.rs @@ -46,18 +46,20 @@ impl EnvironmentName { /// Tries to read the environment name from an argument, then it will try /// to read from an environment variable, otherwise it will fall back to default - pub fn from_arg_or_env_var(arg_name: Option) -> Self { + pub fn from_arg_or_env_var( + arg_name: Option, + ) -> Result { if let Some(arg_name) = arg_name { - return EnvironmentName::Named(arg_name); + return EnvironmentName::from_str(&arg_name); } else if std::env::var("PIXI_IN_SHELL").is_ok() { if let Ok(env_var_name) = std::env::var("PIXI_ENVIRONMENT_NAME") { if env_var_name == consts::DEFAULT_ENVIRONMENT_NAME { - return EnvironmentName::Default; + return Ok(EnvironmentName::Default); } - return EnvironmentName::Named(env_var_name); + return Ok(EnvironmentName::Named(env_var_name)); } } - EnvironmentName::Default + Ok(EnvironmentName::Default) } } diff --git a/src/project/mod.rs b/src/project/mod.rs index f00fad482..a75431dcc 100644 --- a/src/project/mod.rs +++ b/src/project/mod.rs @@ -333,6 +333,16 @@ impl Project { .collect() } + /// Returns an environment in this project based on a name or an environment variable. + pub fn environment_from_name_or_env_var( + &self, + name: Option, + ) -> miette::Result { + let environment_name = EnvironmentName::from_arg_or_env_var(name).into_diagnostic()?; + self.environment(&environment_name) + .ok_or_else(|| miette::miette!("unknown environment '{environment_name}'")) + } + /// Returns all the solve groups in the project. pub fn solve_groups(&self) -> Vec { self.manifest