forked from starship/starship
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Implement terraform module with workspace and version (starship…
- Loading branch information
Showing
11 changed files
with
377 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
use crate::config::{ModuleConfig, RootModuleConfig, SegmentConfig}; | ||
|
||
use ansi_term::{Color, Style}; | ||
use starship_module_config_derive::ModuleConfig; | ||
|
||
#[derive(Clone, ModuleConfig)] | ||
pub struct TerraformConfig<'a> { | ||
pub symbol: SegmentConfig<'a>, | ||
pub workspace: SegmentConfig<'a>, | ||
pub version: SegmentConfig<'a>, | ||
pub style: Style, | ||
pub disabled: bool, | ||
pub show_version: bool, | ||
} | ||
|
||
impl<'a> RootModuleConfig<'a> for TerraformConfig<'a> { | ||
fn new() -> Self { | ||
TerraformConfig { | ||
symbol: SegmentConfig::new("💠 "), | ||
workspace: SegmentConfig::default(), | ||
version: SegmentConfig::default(), | ||
style: Color::Fixed(105).bold(), | ||
disabled: false, | ||
show_version: false, | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -36,6 +36,7 @@ pub const ALL_MODULES: &[&str] = &[ | |
"ruby", | ||
"rust", | ||
"php", | ||
"terraform", | ||
"time", | ||
"username", | ||
]; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,125 @@ | ||
use super::{Context, Module, RootModuleConfig}; | ||
|
||
use crate::configs::terraform::TerraformConfig; | ||
use crate::utils; | ||
use std::env; | ||
use std::io; | ||
use std::path::PathBuf; | ||
|
||
/// Creates a module with the current Terraform version and workspace | ||
/// | ||
/// Will display the Terraform version and workspace if any of the following criteria are met: | ||
/// - Current directory contains a `.terraform` directory | ||
/// - Current directory contains a file with the `.tf` extension | ||
pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { | ||
let is_terraform_project = context | ||
.try_begin_scan()? | ||
.set_folders(&[".terraform"]) | ||
.set_extensions(&["tf"]) | ||
.is_match(); | ||
|
||
if !is_terraform_project { | ||
return None; | ||
} | ||
|
||
let mut module = context.new_module("terraform"); | ||
let config: TerraformConfig = TerraformConfig::try_load(module.config); | ||
|
||
module.set_style(config.style); | ||
module.create_segment("symbol", &config.symbol); | ||
|
||
if config.show_version { | ||
let terraform_version = | ||
format_terraform_version(&utils::exec_cmd("terraform", &["version"])?.stdout.as_str())?; | ||
module.create_segment("version", &config.version.with_value(&terraform_version)); | ||
} | ||
|
||
let terraform_workspace = &get_terraform_workspace(&context.current_dir)?; | ||
module.create_segment( | ||
"workspace", | ||
&config.workspace.with_value(&terraform_workspace), | ||
); | ||
|
||
Some(module) | ||
} | ||
|
||
// Determines the currently selected workspace (see https://github.com/hashicorp/terraform/blob/master/command/meta.go for the original implementation) | ||
fn get_terraform_workspace(cwd: &PathBuf) -> Option<String> { | ||
// Workspace can be explicitly overwritten by an env var | ||
let workspace_override = env::var("TF_WORKSPACE"); | ||
if workspace_override.is_ok() { | ||
return workspace_override.ok(); | ||
} | ||
|
||
// Data directory containing current workspace can be overwritten by an env var | ||
let datadir = match env::var("TF_DATA_DIR") { | ||
Ok(s) => PathBuf::from(s), | ||
Err(_) => cwd.join(".terraform"), | ||
}; | ||
match utils::read_file(datadir.join("environment")) { | ||
Err(ref e) if e.kind() == io::ErrorKind::NotFound => Some("default".to_string()), | ||
Ok(s) => Some(s), | ||
_ => None, | ||
} | ||
} | ||
|
||
fn format_terraform_version(version: &str) -> Option<String> { | ||
// `terraform version` output looks like this | ||
// Terraform v0.12.14 | ||
// With potential extra output if it detects you are not running the latest version | ||
Some( | ||
version | ||
.lines() | ||
.next()? | ||
.trim_start_matches("Terraform ") | ||
.trim() | ||
.to_owned() | ||
+ " ", | ||
) | ||
} | ||
|
||
#[cfg(test)] | ||
mod tests { | ||
use super::*; | ||
|
||
#[test] | ||
fn test_format_terraform_version_release() { | ||
let input = "Terraform v0.12.14"; | ||
assert_eq!( | ||
format_terraform_version(input), | ||
Some("v0.12.14 ".to_string()) | ||
); | ||
} | ||
|
||
#[test] | ||
fn test_format_terraform_version_prerelease() { | ||
let input = "Terraform v0.12.14-rc1"; | ||
assert_eq!( | ||
format_terraform_version(input), | ||
Some("v0.12.14-rc1 ".to_string()) | ||
); | ||
} | ||
|
||
#[test] | ||
fn test_format_terraform_version_development() { | ||
let input = "Terraform v0.12.14-dev (cca89f74)"; | ||
assert_eq!( | ||
format_terraform_version(input), | ||
Some("v0.12.14-dev (cca89f74) ".to_string()) | ||
); | ||
} | ||
|
||
#[test] | ||
fn test_format_terraform_version_multiline() { | ||
let input = "Terraform v0.12.13 | ||
Your version of Terraform is out of date! The latest version | ||
is 0.12.14. You can update by downloading from www.terraform.io/downloads.html | ||
"; | ||
assert_eq!( | ||
format_terraform_version(input), | ||
Some("v0.12.13 ".to_string()) | ||
); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -21,5 +21,6 @@ mod nix_shell; | |
mod nodejs; | ||
mod python; | ||
mod ruby; | ||
mod terraform; | ||
mod time; | ||
mod username; |
Oops, something went wrong.