diff --git a/rust/boil/README.md b/rust/boil/README.md index 35ae3804b..366b49646 100644 --- a/rust/boil/README.md +++ b/rust/boil/README.md @@ -26,11 +26,8 @@ boil build airflow opa # Display a list of all images and their declared versions as structured JSON # output -boil show images +boil image list # Display a list of versions of the image located in the 'airflow' folder -boil show images airflow - -# Soon (hopefully) implemented -boil show graph +boil image list airflow ``` diff --git a/rust/boil/src/build/cli.rs b/rust/boil/src/cli/build.rs similarity index 99% rename from rust/boil/src/build/cli.rs rename to rust/boil/src/cli/build.rs index c3af30a09..539440a09 100644 --- a/rust/boil/src/build/cli.rs +++ b/rust/boil/src/cli/build.rs @@ -10,9 +10,9 @@ use snafu::{ResultExt, Snafu, ensure}; use strum::EnumDiscriminants; use url::Host; -use crate::build::{ +use crate::core::{ docker::BuildArgument, - image::Image, + image::ImageSelector, platform::{Architecture, TargetPlatform}, }; @@ -20,7 +20,7 @@ use crate::build::{ pub struct BuildArguments { /// The image(s) which should be build. The format is name[=version,...]. #[arg(help_heading = "Image Options", required = true)] - pub images: Vec, + pub images: Vec, // NOTE (@Techassi): Should this maybe be renamed to vendor_version? /// The image version being built. diff --git a/rust/boil/src/cli/completions.rs b/rust/boil/src/cli/completions.rs new file mode 100644 index 000000000..a0d6c4c10 --- /dev/null +++ b/rust/boil/src/cli/completions.rs @@ -0,0 +1,26 @@ +use clap::{Args, ValueEnum}; + +#[derive(Debug, Args)] +pub struct CompletionsArguments { + /// Shell to generate completions for. + #[arg(value_enum)] + pub shell: Shell, +} + +#[derive(Clone, Debug, ValueEnum)] +pub enum Shell { + /// Bourne Again SHell + Bash, + + /// Elvish shell + Elvish, + + /// Friendly Interactive SHell + Fish, + + /// Z SHell + Zsh, + + /// Nushell + Nushell, +} diff --git a/rust/boil/src/show/images/cli.rs b/rust/boil/src/cli/image.rs similarity index 53% rename from rust/boil/src/show/images/cli.rs rename to rust/boil/src/cli/image.rs index 0c3469ef5..9e0fc707b 100644 --- a/rust/boil/src/show/images/cli.rs +++ b/rust/boil/src/cli/image.rs @@ -1,11 +1,22 @@ -use clap::{Args, ValueEnum}; +use clap::{Args, Subcommand, ValueEnum}; -use crate::build::image::Image; +use crate::core::image::ImageSelector; #[derive(Debug, Args)] -pub struct ShowImagesArguments { +pub struct ImageArguments { + #[command(subcommand)] + pub command: ImageCommand, +} + +#[derive(Debug, Subcommand)] +pub enum ImageCommand { + List(ImageListArguments), +} + +#[derive(Debug, Args)] +pub struct ImageListArguments { /// Optionally specify one or more images to display. - pub image: Vec, + pub image: Vec, /// Pretty print the structured output. #[arg(long, value_enum, default_value_t = Pretty::default())] diff --git a/rust/boil/src/cli.rs b/rust/boil/src/cli/mod.rs similarity index 81% rename from rust/boil/src/cli.rs rename to rust/boil/src/cli/mod.rs index 7142b0210..5c22b0432 100644 --- a/rust/boil/src/cli.rs +++ b/rust/boil/src/cli/mod.rs @@ -2,7 +2,13 @@ use std::path::PathBuf; use clap::{Parser, Subcommand}; -use crate::{build::cli::BuildArguments, completions::CompletionsArguments, show::ShowArguments}; +mod build; +mod completions; +mod image; + +pub use build::*; +pub use completions::*; +pub use image::*; #[derive(Debug, Parser)] #[command(author, version, about)] @@ -30,7 +36,10 @@ pub enum Command { Build(Box), /// Display various structured outputs in JSON format. - Show(ShowArguments), + Image(ImageArguments), + + /// Alias for `image list`. + Images(ImageListArguments), /// Generate shell completions. Completions(CompletionsArguments), diff --git a/rust/boil/src/build/mod.rs b/rust/boil/src/cmd/build.rs similarity index 96% rename from rust/boil/src/build/mod.rs rename to rust/boil/src/cmd/build.rs index 17769a875..adc1f970f 100644 --- a/rust/boil/src/build/mod.rs +++ b/rust/boil/src/cmd/build.rs @@ -6,17 +6,12 @@ use std::{ use snafu::{OptionExt, ResultExt, Snafu, ensure}; use crate::{ - build::{bakefile::Bakefile, cli::BuildArguments}, + cli::BuildArguments, config::Config, + core::bakefile::{self, Bakefile}, utils::CommandExt, }; -pub mod bakefile; -pub mod cli; -pub mod docker; -pub mod image; -pub mod platform; - #[derive(Debug, Snafu)] pub enum Error { #[snafu(display("failed to create bakefile"))] diff --git a/rust/boil/src/completions/mod.rs b/rust/boil/src/cmd/completions.rs similarity index 64% rename from rust/boil/src/completions/mod.rs rename to rust/boil/src/cmd/completions.rs index b15a6aac1..e8cd85c4a 100644 --- a/rust/boil/src/completions/mod.rs +++ b/rust/boil/src/cmd/completions.rs @@ -1,36 +1,11 @@ -use clap::{Args, Command, CommandFactory, ValueEnum}; +use clap::{Command, CommandFactory}; use clap_complete::{ Generator, Shell::{Bash, Elvish, Fish, Zsh}, }; use clap_complete_nushell::Nushell; -use crate::cli::Cli; - -#[derive(Debug, Args)] -pub struct CompletionsArguments { - /// Shell to generate completions for. - #[arg(value_enum)] - pub shell: Shell, -} - -#[derive(Clone, Debug, ValueEnum)] -pub enum Shell { - /// Bourne Again SHell - Bash, - - /// Elvish shell - Elvish, - - /// Friendly Interactive SHell - Fish, - - /// Z SHell - Zsh, - - /// Nushell - Nushell, -} +use crate::cli::{Cli, CompletionsArguments, Shell}; /// This is the `boil completions` command handler function. pub fn run_command(arguments: CompletionsArguments) { diff --git a/rust/boil/src/show/images/mod.rs b/rust/boil/src/cmd/image.rs similarity index 84% rename from rust/boil/src/show/images/mod.rs rename to rust/boil/src/cmd/image.rs index f977fd02e..9c53f105f 100644 --- a/rust/boil/src/show/images/mod.rs +++ b/rust/boil/src/cmd/image.rs @@ -3,23 +3,21 @@ use std::{collections::BTreeMap, io::IsTerminal}; use snafu::{ResultExt, Snafu}; use crate::{ - build::bakefile::{Targets, TargetsError, TargetsOptions}, - show::images::cli::{Pretty, ShowImagesArguments}, + cli::{ImageListArguments, Pretty}, + core::bakefile::{self, Targets, TargetsOptions}, }; -pub mod cli; - #[derive(Debug, Snafu)] pub enum Error { #[snafu(display("failed to serialize list as JSON"))] SerializeList { source: serde_json::Error }, #[snafu(display("failed to build list of targets"))] - BuildTargets { source: TargetsError }, + BuildTargets { source: bakefile::TargetsError }, } /// This is the `boil show images` command handler function. -pub fn run_command(arguments: ShowImagesArguments) -> Result<(), Error> { +pub fn list_images(arguments: ImageListArguments) -> Result<(), Error> { let list: BTreeMap<_, _> = if arguments.image.is_empty() { Targets::all(TargetsOptions { only_entry: true }) .context(BuildTargetsSnafu)? diff --git a/rust/boil/src/cmd/mod.rs b/rust/boil/src/cmd/mod.rs new file mode 100644 index 000000000..dc1532eaa --- /dev/null +++ b/rust/boil/src/cmd/mod.rs @@ -0,0 +1,3 @@ +pub mod build; +pub mod completions; +pub mod image; diff --git a/rust/boil/src/config.rs b/rust/boil/src/config.rs index 948be2901..34351c1e0 100644 --- a/rust/boil/src/config.rs +++ b/rust/boil/src/config.rs @@ -4,7 +4,7 @@ use serde::Deserialize; use snafu::{ResultExt, Snafu}; use url::Url; -use crate::build::docker::BuildArguments; +use crate::core::docker; #[derive(Debug, Snafu)] pub enum ConfigError { @@ -16,7 +16,7 @@ pub enum ConfigError { #[derive(Debug, Deserialize)] #[serde(rename_all = "kebab-case")] pub struct Config { - pub build_arguments: BuildArguments, + pub build_arguments: docker::BuildArguments, pub metadata: Metadata, } diff --git a/rust/boil/src/constants.rs b/rust/boil/src/constants.rs new file mode 100644 index 000000000..59d207a05 --- /dev/null +++ b/rust/boil/src/constants.rs @@ -0,0 +1,2 @@ +/// Label key for the date and time on which the image was built. +pub const DOCKER_LABEL_BUILD_DATE: &str = "build-date"; diff --git a/rust/boil/src/build/bakefile.rs b/rust/boil/src/core/bakefile.rs similarity index 94% rename from rust/boil/src/build/bakefile.rs rename to rust/boil/src/core/bakefile.rs index 06f3efe08..fa9b74c33 100644 --- a/rust/boil/src/build/bakefile.rs +++ b/rust/boil/src/core/bakefile.rs @@ -18,13 +18,14 @@ use time::format_description::well_known::Rfc3339; use crate::{ VersionExt, - build::{ - cli::{self, HostPort}, - docker::{BuildArgument, BuildArguments, LABEL_BUILD_DATE, ParseBuildArgumentsError}, - image::{Image, ImageConfig, ImageConfigError, ImageOptions, VersionOptionsPair}, + cli::{self, HostPort}, + config::{self, Config, Metadata}, + constants::DOCKER_LABEL_BUILD_DATE, + core::{ + docker, + image::{ImageConfig, ImageConfigError, ImageOptions, ImageSelector, VersionOptionsPair}, platform::TargetPlatform, }, - config::{self, Config, Metadata}, utils, }; @@ -55,7 +56,9 @@ pub enum Error { CreateGraph { source: TargetsError }, #[snafu(display("failed to parse build arguments"))] - ParseBuildArguments { source: ParseBuildArgumentsError }, + ParseBuildArguments { + source: docker::ParseBuildArgumentsError, + }, #[snafu(display("failed to locate containerfile relative to the {path:?} directory"))] NoSuchContainerfileExists { path: String }, @@ -162,7 +165,7 @@ impl Targets { /// Returns a filtered set out of all targets by looking up selected image config files. /// /// The search behaviour can be customized using the provided [`TargetsOptions`]. - pub fn set(images: &[Image], options: TargetsOptions) -> Result { + pub fn set(images: &[ImageSelector], options: TargetsOptions) -> Result { let mut targets = Self::default(); for image in images { @@ -274,7 +277,7 @@ impl Bakefile { /// Creates the common target, containing shared data, which will be inherited by other targets. fn common_target( cli_args: &cli::BuildArguments, - container_build_args: BuildArguments, + container_build_args: docker::BuildArguments, metadata: &Metadata, ) -> Result { let revision = Self::git_head_revision().context(GetRevisionSnafu)?; @@ -284,7 +287,7 @@ impl Bakefile { let mut user_container_build_args = cli_args.build_arguments.clone(); if let Some(path) = &cli_args.build_arguments_file { let build_arguments_from_file = - BuildArguments::from_file(path).context(ParseBuildArgumentsSnafu)?; + docker::BuildArguments::from_file(path).context(ParseBuildArgumentsSnafu)?; user_container_build_args.extend(build_arguments_from_file); } @@ -350,13 +353,13 @@ impl Bakefile { // TODO (@Techassi): Clean this up // TODO (@Techassi): Move the arg formatting into functions - let mut build_arguments = BuildArguments::new(); + let mut build_arguments = docker::BuildArguments::new(); let local_version_docker_args: Vec<_> = image_options .local_images .iter() .map(|(image_name, image_version)| { - BuildArgument::local_image_version( + docker::BuildArgument::local_image_version( image_name.to_string(), image_version.to_string(), ) @@ -366,23 +369,23 @@ impl Bakefile { build_arguments.extend(image_options.build_arguments); build_arguments.extend(local_version_docker_args); // TODO (@Techassi): Rename this to IMAGE_VERSION - build_arguments.insert(BuildArgument::new( + build_arguments.insert(docker::BuildArgument::new( "PRODUCT_VERSION".to_owned(), image_version.to_string(), )); - build_arguments.insert(BuildArgument::new( + build_arguments.insert(docker::BuildArgument::new( "IMAGE_REPOSITORY_URI".to_owned(), image_repository_uri, )); - build_arguments.insert(BuildArgument::new( + build_arguments.insert(docker::BuildArgument::new( "IMAGE_INDEX_MANIFEST_TAG".to_owned(), image_index_manifest_tag, )); - build_arguments.insert(BuildArgument::new( + build_arguments.insert(docker::BuildArgument::new( "IMAGE_MANIFEST_TAG".to_owned(), image_manifest_tag, )); - build_arguments.insert(BuildArgument::new( + build_arguments.insert(docker::BuildArgument::new( "IMAGE_MANIFEST_URI".to_owned(), image_manifest_uri.clone(), )); @@ -518,8 +521,11 @@ impl Bakefile { #[derive(Debug, Default, Serialize)] pub struct BakefileTarget { /// Defines build arguments for the target. - #[serde(rename = "args", skip_serializing_if = "BuildArguments::is_empty")] - pub arguments: BuildArguments, + #[serde( + rename = "args", + skip_serializing_if = "docker::BuildArguments::is_empty" + )] + pub arguments: docker::BuildArguments, /// Adds annotations to images built with bake. #[serde(skip_serializing_if = "Vec::is_empty")] @@ -568,8 +574,8 @@ impl BakefileTarget { date_time: String, revision: String, release_version: String, - container_build_args: BuildArguments, - user_container_build_args: Vec, + container_build_args: docker::BuildArguments, + user_container_build_args: Vec, metadata: &Metadata, ) -> Self { let config::Metadata { @@ -611,7 +617,7 @@ impl BakefileTarget { let mut arguments = container_build_args; arguments.extend(user_container_build_args); - arguments.insert(BuildArgument::new( + arguments.insert(docker::BuildArgument::new( "RELEASE_VERSION".to_owned(), release_version, )); @@ -622,7 +628,7 @@ impl BakefileTarget { let labels = BTreeMap::from([ (ANNOTATION_CREATED.to_owned(), date_time.clone()), (ANNOTATION_REVISION.to_owned(), revision), - (LABEL_BUILD_DATE.to_owned(), date_time), + (DOCKER_LABEL_BUILD_DATE.to_owned(), date_time), ]); Self { diff --git a/rust/boil/src/build/docker.rs b/rust/boil/src/core/docker.rs similarity index 97% rename from rust/boil/src/build/docker.rs rename to rust/boil/src/core/docker.rs index c338654d4..f084a293a 100644 --- a/rust/boil/src/build/docker.rs +++ b/rust/boil/src/core/docker.rs @@ -9,9 +9,6 @@ use std::{ use serde::{Deserialize, Serialize, de::Visitor, ser::SerializeMap}; use snafu::{OptionExt, ResultExt, Snafu, ensure}; -/// Label key for the date and time on which the image was built. -pub const LABEL_BUILD_DATE: &str = "build-date"; - #[derive(Debug, Snafu)] pub enum ParseBuildArgumentError { #[snafu(display("invalid format, expected ="))] diff --git a/rust/boil/src/build/image.rs b/rust/boil/src/core/image.rs similarity index 87% rename from rust/boil/src/build/image.rs rename to rust/boil/src/core/image.rs index f0009efc6..306123285 100644 --- a/rust/boil/src/build/image.rs +++ b/rust/boil/src/core/image.rs @@ -9,10 +9,10 @@ use std::{ use serde::Deserialize; use snafu::{ResultExt as _, Snafu, ensure}; -use crate::{IfContext, build::docker::BuildArguments}; +use crate::{IfContext, core::docker}; #[derive(Debug, PartialEq, Snafu)] -pub enum ParseImageError { +pub enum ParseImageSelectorError { #[snafu(display("input must not be empty"))] EmptyInput, @@ -27,13 +27,13 @@ pub enum ParseImageError { } #[derive(Clone, Debug)] -pub struct Image { +pub struct ImageSelector { pub name: String, pub versions: Vec, } -impl FromStr for Image { - type Err = ParseImageError; +impl FromStr for ImageSelector { + type Err = ParseImageSelectorError; fn from_str(input: &str) -> Result { // Get rid of any leading and traling whitespace @@ -69,7 +69,7 @@ impl FromStr for Image { } } -impl Display for Image { +impl Display for ImageSelector { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { if self.versions.is_empty() { f.write_str(&self.name) @@ -84,7 +84,7 @@ impl Display for Image { } } -impl Image { +impl ImageSelector { fn new(name: String, versions: Vec) -> Self { Self { name, versions } } @@ -181,7 +181,7 @@ pub struct ImageOptions { // NOTE (@Techassi): Potentially add a dependencies field here which will be automatically be // suffixed with _VERSION. #[serde(default)] - pub build_arguments: BuildArguments, + pub build_arguments: docker::BuildArguments, /// A custom path to a Dockerfile/Containerfile for a particular version of an image. /// @@ -223,19 +223,23 @@ mod tests { #[case("name=1.2.3", &["1.2.3"])] #[case("name", &[])] fn valid(#[case] input: &str, #[case] expected_versions: &[&str]) { - let Image { versions, .. } = Image::from_str(input).expect("must be a valid image"); + let ImageSelector { versions, .. } = + ImageSelector::from_str(input).expect("must be a valid image"); assert_eq!(versions, expected_versions); } #[rstest] - #[case("double/equal/image=1.2.3=4.5.6", ParseImageError::InvalidFormat)] - #[case("~/image/folder/with/tilde", ParseImageError::UnsupportedChars)] - #[case("/absolute/image/folder", ParseImageError::AbsolutePath)] - #[case("empty/version/image=", ParseImageError::InvalidFormat)] - #[case(" ", ParseImageError::EmptyInput)] - #[case("", ParseImageError::EmptyInput)] - fn invalid(#[case] input: &str, #[case] expected_error: ParseImageError) { - let error = Image::from_str(input).expect_err("invalid image must not parse"); + #[case( + "double/equal/image=1.2.3=4.5.6", + ParseImageSelectorError::InvalidFormat + )] + #[case("~/image/folder/with/tilde", ParseImageSelectorError::UnsupportedChars)] + #[case("/absolute/image/folder", ParseImageSelectorError::AbsolutePath)] + #[case("empty/version/image=", ParseImageSelectorError::InvalidFormat)] + #[case(" ", ParseImageSelectorError::EmptyInput)] + #[case("", ParseImageSelectorError::EmptyInput)] + fn invalid(#[case] input: &str, #[case] expected_error: ParseImageSelectorError) { + let error = ImageSelector::from_str(input).expect_err("invalid image must not parse"); assert_eq!(error, expected_error); } } diff --git a/rust/boil/src/core/mod.rs b/rust/boil/src/core/mod.rs new file mode 100644 index 000000000..2fb183338 --- /dev/null +++ b/rust/boil/src/core/mod.rs @@ -0,0 +1,4 @@ +pub mod bakefile; +pub mod docker; +pub mod image; +pub mod platform; diff --git a/rust/boil/src/build/platform.rs b/rust/boil/src/core/platform.rs similarity index 100% rename from rust/boil/src/build/platform.rs rename to rust/boil/src/core/platform.rs diff --git a/rust/boil/src/main.rs b/rust/boil/src/main.rs index 4a7957455..dde2f33a4 100644 --- a/rust/boil/src/main.rs +++ b/rust/boil/src/main.rs @@ -3,21 +3,18 @@ use semver::Version; use snafu::{ResultExt, Snafu}; use crate::{ - cli::{Cli, Command}, + cli::{Cli, Command, ImageArguments, ImageCommand}, config::Config, - show::ShowCommand, }; // Common modules mod cli; +mod cmd; mod config; +mod constants; +mod core; mod utils; -// Command modules -mod build; -mod completions; -mod show; - /// This trait extends functionailty provided by [`snafu`]. /// /// [`snafu`] already provides various ways to extend [`Result`]s with additional context-sensitive @@ -85,10 +82,10 @@ impl VersionExt for Version { #[derive(Debug, Snafu)] enum Error { #[snafu(display("failed to run build command"))] - Build { source: build::Error }, + Build { source: cmd::build::Error }, - #[snafu(display("failed to run show command"))] - Show { source: show::images::Error }, + #[snafu(display("failed to run image command"))] + Image { source: cmd::image::Error }, #[snafu(display("failed to read config"))] ReadConfig { source: config::ConfigError }, @@ -102,15 +99,14 @@ async fn main() -> Result<(), Error> { match cli.command { Command::Build(arguments) => { let config = Config::from_file(&cli.config_path).context(ReadConfigSnafu)?; - build::run_command(arguments, config).context(BuildSnafu) + cmd::build::run_command(arguments, config).context(BuildSnafu) } - Command::Show(arguments) => match arguments.commands { - ShowCommand::Images(arguments) => { - show::images::run_command(arguments).context(ShowSnafu) - } - }, + Command::Images(arguments) + | Command::Image(ImageArguments { + command: ImageCommand::List(arguments), + }) => cmd::image::list_images(arguments).context(ImageSnafu), Command::Completions(arguments) => { - completions::run_command(arguments); + cmd::completions::run_command(arguments); Ok(()) } } @@ -118,31 +114,31 @@ async fn main() -> Result<(), Error> { #[cfg(test)] mod tests { - use rstest::rstest; - - use super::*; - - #[rstest] - #[case("25.11.0-rc.1+arm64", "25.11.0-rc.1")] - #[case("25.11.0-rc.1", "25.11.0-rc.1")] - #[case("25.11.0-rc1", "25.11.0-rc1")] - #[case("0.0.0-dev", "0.0.0-dev")] - #[case("25.11.0", "25.11.0")] - #[case("0.0.0", "0.0.0")] - fn version_ext_base_prerelease(#[case] input: &str, #[case] expected: &str) { - let version: Version = input.parse().expect("must be a valid semantic version"); - assert_eq!(version.base_prerelease(), expected); - } - - #[rstest] - #[case("25.11.0-rc.1+arm64", "25.11.0")] - #[case("25.11.0-rc.1", "25.11.0")] - #[case("25.11.0-rc1", "25.11.0")] - #[case("0.0.0-dev", "0.0.0")] - #[case("25.11.0", "25.11.0")] - #[case("0.0.0", "0.0.0")] - fn version_ext_base(#[case] input: &str, #[case] expected: &str) { - let version: Version = input.parse().expect("must be a valid semantic version"); - assert_eq!(version.base(), expected); - } + // use rstest::rstest; + + // use super::*; + + // #[rstest] + // #[case("25.11.0-rc.1+arm64", "25.11.0-rc.1")] + // #[case("25.11.0-rc.1", "25.11.0-rc.1")] + // #[case("25.11.0-rc1", "25.11.0-rc1")] + // #[case("0.0.0-dev", "0.0.0-dev")] + // #[case("25.11.0", "25.11.0")] + // #[case("0.0.0", "0.0.0")] + // fn version_ext_base_prerelease(#[case] input: &str, #[case] expected: &str) { + // let version: Version = input.parse().expect("must be a valid semantic version"); + // assert_eq!(version.base_prerelease(), expected); + // } + + // #[rstest] + // #[case("25.11.0-rc.1+arm64", "25.11.0")] + // #[case("25.11.0-rc.1", "25.11.0")] + // #[case("25.11.0-rc1", "25.11.0")] + // #[case("0.0.0-dev", "0.0.0")] + // #[case("25.11.0", "25.11.0")] + // #[case("0.0.0", "0.0.0")] + // fn version_ext_base(#[case] input: &str, #[case] expected: &str) { + // let version: Version = input.parse().expect("must be a valid semantic version"); + // assert_eq!(version.base(), expected); + // } } diff --git a/rust/boil/src/show/mod.rs b/rust/boil/src/show/mod.rs deleted file mode 100644 index a6ad01b43..000000000 --- a/rust/boil/src/show/mod.rs +++ /dev/null @@ -1,16 +0,0 @@ -use clap::{Args, Subcommand}; - -use crate::show::images::cli::ShowImagesArguments; - -pub mod images; - -#[derive(Debug, Args)] -pub struct ShowArguments { - #[command(subcommand)] - pub commands: ShowCommand, -} - -#[derive(Debug, Subcommand)] -pub enum ShowCommand { - Images(ShowImagesArguments), -} diff --git a/rust/boil/src/utils.rs b/rust/boil/src/utils.rs index 81d6d1991..6a81ec954 100644 --- a/rust/boil/src/utils.rs +++ b/rust/boil/src/utils.rs @@ -2,7 +2,7 @@ use std::process::Command; use semver::Version; -use crate::build::{cli::HostPort, platform::Architecture}; +use crate::{cli::HostPort, core::platform::Architecture}; /// Formats and returns the image repository URI, eg. `oci.stackable.tech/sdp/opa`. pub fn format_image_repository_uri(