mirror of
https://github.com/starship/starship.git
synced 2024-11-07 17:05:09 +01:00
feat: add docker context module (#996)
* feat: add docker context module Adds a simple module that checks for a Docker config file and if present, reads the `currentContext` value out and displays on the prompt with a whale. * feat: add `only_with_compose_yml` option to docker_context When enabled, will only show the docker context name if there's a docker-compose.yml file in the current directory. * Update src/modules/docker_context.rs Co-Authored-By: Thomas O'Donnell <andytom@users.noreply.github.com> * Update src/modules/docker_context.rs Co-Authored-By: Thomas O'Donnell <andytom@users.noreply.github.com> * rename `only_with_compose_yml` configuration key to a more generic `only_with_files` * Update src/modules/docker_context.rs Co-Authored-By: Thomas O'Donnell <andytom@users.noreply.github.com> * re-order configuration table * Update docs/config/README.md Co-Authored-By: Thomas O'Donnell <andytom@users.noreply.github.com> * Update src/configs/docker_context.rs Co-Authored-By: Thomas O'Donnell <andytom@users.noreply.github.com> Co-authored-by: Thomas O'Donnell <andytom@users.noreply.github.com>
This commit is contained in:
parent
7a39ba6ff1
commit
b685bb2954
@ -100,6 +100,7 @@ prompt_order = [
|
||||
"git_state",
|
||||
"git_status",
|
||||
"hg_branch",
|
||||
"docker_context",
|
||||
"package",
|
||||
"dotnet",
|
||||
"elixir",
|
||||
@ -405,6 +406,30 @@ a single character. For `fish_style_pwd_dir_length = 2`, it would be `/bu/th/ci/
|
||||
truncation_length = 8
|
||||
```
|
||||
|
||||
## Docker Context
|
||||
|
||||
The `docker_context` module shows the currently active
|
||||
[Docker context](https://docs.docker.com/engine/context/working-with-contexts/) if it's not set to
|
||||
`default`.
|
||||
|
||||
### Options
|
||||
|
||||
| Variable | Default | Description |
|
||||
| ----------------- | ------------- | ---------------------------------------------------------------------------- |
|
||||
| `symbol` | `"🐳 "` | The symbol used before displaying the Docker context . |
|
||||
| `only_with_files` | `false` | Only show when there's a `docker-compose.yml` or `Dockerfile` in the current directory. |
|
||||
| `style` | `"bold blue"` | The style for the module. |
|
||||
| `disabled` | `true` | Disables the `docker_context` module. |
|
||||
|
||||
### Example
|
||||
|
||||
```toml
|
||||
# ~/.config/starship.toml
|
||||
|
||||
[docker_context]
|
||||
symbol = "🐋 "
|
||||
```
|
||||
|
||||
## Dotnet
|
||||
|
||||
The `dotnet` module shows the relevant version of the .NET Core SDK for the current directory. If
|
||||
|
25
src/configs/docker_context.rs
Normal file
25
src/configs/docker_context.rs
Normal file
@ -0,0 +1,25 @@
|
||||
use crate::config::{ModuleConfig, RootModuleConfig, SegmentConfig};
|
||||
|
||||
use ansi_term::{Color, Style};
|
||||
use starship_module_config_derive::ModuleConfig;
|
||||
|
||||
#[derive(Clone, ModuleConfig)]
|
||||
pub struct DockerContextConfig<'a> {
|
||||
pub symbol: SegmentConfig<'a>,
|
||||
pub context: SegmentConfig<'a>,
|
||||
pub style: Style,
|
||||
pub only_with_files: bool,
|
||||
pub disabled: bool,
|
||||
}
|
||||
|
||||
impl<'a> RootModuleConfig<'a> for DockerContextConfig<'a> {
|
||||
fn new() -> Self {
|
||||
DockerContextConfig {
|
||||
symbol: SegmentConfig::new("🐳 "),
|
||||
context: SegmentConfig::default(),
|
||||
style: Color::Blue.bold(),
|
||||
only_with_files: true,
|
||||
disabled: false,
|
||||
}
|
||||
}
|
||||
}
|
@ -5,6 +5,7 @@ pub mod cmd_duration;
|
||||
pub mod conda;
|
||||
pub mod crystal;
|
||||
pub mod directory;
|
||||
pub mod docker_context;
|
||||
pub mod dotnet;
|
||||
pub mod elixir;
|
||||
pub mod elm;
|
||||
|
@ -27,6 +27,7 @@ impl<'a> RootModuleConfig<'a> for StarshipRootConfig<'a> {
|
||||
"git_state",
|
||||
"git_status",
|
||||
"hg_branch",
|
||||
"docker_context",
|
||||
"package",
|
||||
// ↓ Toolchain version modules ↓
|
||||
// (Let's keep these sorted alphabetically)
|
||||
|
@ -17,6 +17,7 @@ pub const ALL_MODULES: &[&str] = &[
|
||||
"cmd_duration",
|
||||
"conda",
|
||||
"directory",
|
||||
"docker_context",
|
||||
"dotnet",
|
||||
"elixir",
|
||||
"elm",
|
||||
|
48
src/modules/docker_context.rs
Normal file
48
src/modules/docker_context.rs
Normal file
@ -0,0 +1,48 @@
|
||||
use dirs::home_dir;
|
||||
|
||||
use super::{Context, Module, RootModuleConfig};
|
||||
|
||||
use crate::configs::docker_context::DockerContextConfig;
|
||||
use crate::utils;
|
||||
|
||||
const DOCKER_CONFIG_FILE: &str = ".docker/config.json";
|
||||
|
||||
/// Creates a module with the currently active Docker context
|
||||
///
|
||||
/// Will display the Docker context if the following criteria are met:
|
||||
/// - There is a file named `$HOME/.docker/config.json`
|
||||
/// - The file is JSON and contains a field named `currentContext`
|
||||
/// - The value of `currentContext` is not `default`
|
||||
pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
|
||||
let mut module = context.new_module("docker_context");
|
||||
let config: DockerContextConfig = DockerContextConfig::try_load(module.config);
|
||||
|
||||
if config.only_with_files
|
||||
&& !context
|
||||
.try_begin_scan()?
|
||||
.set_files(&["docker-compose.yml", "Dockerfile"])
|
||||
.is_match()
|
||||
{
|
||||
return None;
|
||||
}
|
||||
|
||||
let config_path = home_dir()?.join(DOCKER_CONFIG_FILE);
|
||||
let json = utils::read_file(config_path).ok()?;
|
||||
let parsed_json = serde_json::from_str(&json).ok()?;
|
||||
|
||||
match parsed_json {
|
||||
serde_json::Value::Object(root) => {
|
||||
let current_context = root.get("currentContext")?;
|
||||
match current_context {
|
||||
serde_json::Value::String(ctx) => {
|
||||
module.set_style(config.style);
|
||||
module.create_segment("symbol", &config.symbol);
|
||||
module.create_segment("context", &config.context.with_value(&ctx));
|
||||
Some(module)
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
@ -5,6 +5,7 @@ mod cmd_duration;
|
||||
mod conda;
|
||||
mod crystal;
|
||||
mod directory;
|
||||
mod docker_context;
|
||||
mod dotnet;
|
||||
mod elixir;
|
||||
mod elm;
|
||||
@ -54,6 +55,7 @@ pub fn handle<'a>(module: &str, context: &'a Context) -> Option<Module<'a>> {
|
||||
"cmd_duration" => cmd_duration::module(context),
|
||||
"conda" => conda::module(context),
|
||||
"directory" => directory::module(context),
|
||||
"docker_context" => docker_context::module(context),
|
||||
"dotnet" => dotnet::module(context),
|
||||
"elixir" => elixir::module(context),
|
||||
"elm" => elm::module(context),
|
||||
@ -101,6 +103,7 @@ pub fn description(module: &str) -> &'static str {
|
||||
"cmd_duration" => "How long the last command took to execute",
|
||||
"conda" => "The current conda environment, if $CONDA_DEFAULT_ENV is set",
|
||||
"directory" => "The current working directory",
|
||||
"docker_context" => "The current docker context",
|
||||
"dotnet" => "The relevant version of the .NET Core SDK for the current directory",
|
||||
"env_var" => "Displays the current value of a selected environment variable",
|
||||
"git_branch" => "The active branch of the repo in your current directory",
|
||||
|
Loading…
Reference in New Issue
Block a user