mirror of
https://github.com/Llewellynvdm/starship.git
synced 2024-11-10 23:30:57 +00:00
feat: Add an Elm module (#879)
Former-commit-id: d42137309da457a438b554601f0734db963a193e
This commit is contained in:
parent
af6a9e2e56
commit
273a937505
@ -88,6 +88,7 @@ The prompt shows information you need while you're working, while staying sleek
|
|||||||
## 🍬 Features
|
## 🍬 Features
|
||||||
|
|
||||||
- Prompt character turns red if the last command exits with non-zero code
|
- Prompt character turns red if the last command exits with non-zero code
|
||||||
|
- Current Elm version (`🌳`)
|
||||||
- Current Go version (`🐹`)
|
- Current Go version (`🐹`)
|
||||||
- Current Haskell version (`λ`)
|
- Current Haskell version (`λ`)
|
||||||
- Current Java version(`☕`)
|
- Current Java version(`☕`)
|
||||||
|
@ -102,6 +102,7 @@ prompt_order = [
|
|||||||
"hg_branch",
|
"hg_branch",
|
||||||
"package",
|
"package",
|
||||||
"dotnet",
|
"dotnet",
|
||||||
|
"elm",
|
||||||
"golang",
|
"golang",
|
||||||
"haskell",
|
"haskell",
|
||||||
"java",
|
"java",
|
||||||
@ -405,6 +406,34 @@ style = "green"
|
|||||||
heuristic = false
|
heuristic = false
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Elm
|
||||||
|
|
||||||
|
The `elm` module shows the currently installed version of Elm version.
|
||||||
|
The module will be shown if any of the following conditions are met:
|
||||||
|
|
||||||
|
- The current directory contains a `elm.json` file
|
||||||
|
- The current directory contains a `elm-package.json` file
|
||||||
|
- The current directory contains a `elm-stuff` folder
|
||||||
|
- The current directory contains a `*.elm` files
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
| Variable | Default | Description |
|
||||||
|
| ---------- | ------------- | --------------------------------------------------------- |
|
||||||
|
| `symbol` | `"🌳 "` | The symbol used before displaying the version of Elm. |
|
||||||
|
| `style` | `"bold cyan"` | The style for the module. |
|
||||||
|
| `disabled` | `false` | Disables the `elm` module. |
|
||||||
|
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
```toml
|
||||||
|
# ~/.config/starship.toml
|
||||||
|
|
||||||
|
[elm]
|
||||||
|
symbol = "λx.x "
|
||||||
|
```
|
||||||
|
|
||||||
## Environment Variable
|
## Environment Variable
|
||||||
|
|
||||||
The `env_var` module displays the current value of a selected environment variable.
|
The `env_var` module displays the current value of a selected environment variable.
|
||||||
|
23
src/configs/elm.rs
Normal file
23
src/configs/elm.rs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
use crate::config::{ModuleConfig, RootModuleConfig, SegmentConfig};
|
||||||
|
|
||||||
|
use ansi_term::{Color, Style};
|
||||||
|
use starship_module_config_derive::ModuleConfig;
|
||||||
|
|
||||||
|
#[derive(Clone, ModuleConfig)]
|
||||||
|
pub struct ElmConfig<'a> {
|
||||||
|
pub symbol: SegmentConfig<'a>,
|
||||||
|
pub version: SegmentConfig<'a>,
|
||||||
|
pub style: Style,
|
||||||
|
pub disabled: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> RootModuleConfig<'a> for ElmConfig<'a> {
|
||||||
|
fn new() -> Self {
|
||||||
|
ElmConfig {
|
||||||
|
symbol: SegmentConfig::new("🌳 "),
|
||||||
|
version: SegmentConfig::default(),
|
||||||
|
style: Color::Cyan.bold(),
|
||||||
|
disabled: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -6,6 +6,7 @@ pub mod conda;
|
|||||||
pub mod crystal;
|
pub mod crystal;
|
||||||
pub mod directory;
|
pub mod directory;
|
||||||
pub mod dotnet;
|
pub mod dotnet;
|
||||||
|
pub mod elm;
|
||||||
pub mod env_var;
|
pub mod env_var;
|
||||||
pub mod git_branch;
|
pub mod git_branch;
|
||||||
pub mod git_commit;
|
pub mod git_commit;
|
||||||
|
@ -30,6 +30,7 @@ impl<'a> RootModuleConfig<'a> for StarshipRootConfig<'a> {
|
|||||||
// ↓ Toolchain version modules ↓
|
// ↓ Toolchain version modules ↓
|
||||||
// (Let's keep these sorted alphabetically)
|
// (Let's keep these sorted alphabetically)
|
||||||
"dotnet",
|
"dotnet",
|
||||||
|
"elm",
|
||||||
"golang",
|
"golang",
|
||||||
"haskell",
|
"haskell",
|
||||||
"java",
|
"java",
|
||||||
|
@ -17,6 +17,7 @@ pub const ALL_MODULES: &[&str] = &[
|
|||||||
"conda",
|
"conda",
|
||||||
"directory",
|
"directory",
|
||||||
"dotnet",
|
"dotnet",
|
||||||
|
"elm",
|
||||||
"env_var",
|
"env_var",
|
||||||
"git_branch",
|
"git_branch",
|
||||||
"git_commit",
|
"git_commit",
|
||||||
|
95
src/modules/elm.rs
Normal file
95
src/modules/elm.rs
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
use super::{Context, Module, RootModuleConfig, SegmentConfig};
|
||||||
|
|
||||||
|
use crate::configs::elm::ElmConfig;
|
||||||
|
use crate::utils;
|
||||||
|
|
||||||
|
/// Creates a module with the current Elm version
|
||||||
|
///
|
||||||
|
/// Will display the Elm version if any of the following criteria are met:
|
||||||
|
/// - The current directory contains a `elm.json` file
|
||||||
|
/// - The current directory contains a `elm-package.json` file
|
||||||
|
/// - The current directory contains a `elm-stuff` folder
|
||||||
|
/// - The current directory contains a `*.elm` files
|
||||||
|
pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
|
||||||
|
let is_elm_project = context
|
||||||
|
.try_begin_scan()?
|
||||||
|
.set_files(&["elm.json", "elm-package.json"])
|
||||||
|
.set_extensions(&["elm"])
|
||||||
|
.set_folders(&["elm-stuff"])
|
||||||
|
.is_match();
|
||||||
|
|
||||||
|
if !is_elm_project {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
let elm_version = utils::exec_cmd("elm", &["--version"])?.stdout;
|
||||||
|
let formatted_version = Some(format!("v{}", elm_version.trim()))?;
|
||||||
|
|
||||||
|
let mut module = context.new_module("elm");
|
||||||
|
let config: ElmConfig = ElmConfig::try_load(module.config);
|
||||||
|
module.set_style(config.style);
|
||||||
|
|
||||||
|
module.create_segment("symbol", &config.symbol);
|
||||||
|
module.create_segment("version", &SegmentConfig::new(&formatted_version));
|
||||||
|
|
||||||
|
Some(module)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use crate::modules::utils::test::render_module;
|
||||||
|
use ansi_term::Color;
|
||||||
|
use std::fs::{self, File};
|
||||||
|
use std::io;
|
||||||
|
use tempfile;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn folder_without_elm() -> io::Result<()> {
|
||||||
|
let dir = tempfile::tempdir()?;
|
||||||
|
let actual = render_module("elm", dir.path());
|
||||||
|
let expected = None;
|
||||||
|
assert_eq!(expected, actual);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn folder_with_elm_json() -> io::Result<()> {
|
||||||
|
let dir = tempfile::tempdir()?;
|
||||||
|
File::create(dir.path().join("elm.json"))?.sync_all()?;
|
||||||
|
let actual = render_module("elm", dir.path());
|
||||||
|
let expected = Some(format!("via {} ", Color::Cyan.bold().paint("🌳 v0.19.1")));
|
||||||
|
assert_eq!(expected, actual);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn folder_with_elm_package_json() -> io::Result<()> {
|
||||||
|
let dir = tempfile::tempdir()?;
|
||||||
|
File::create(dir.path().join("elm-package.json"))?.sync_all()?;
|
||||||
|
let actual = render_module("elm", dir.path());
|
||||||
|
let expected = Some(format!("via {} ", Color::Cyan.bold().paint("🌳 v0.19.1")));
|
||||||
|
assert_eq!(expected, actual);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn folder_with_elm_stuff_directory() -> io::Result<()> {
|
||||||
|
let dir = tempfile::tempdir()?;
|
||||||
|
let elmstuff = dir.path().join("elm-stuff");
|
||||||
|
fs::create_dir_all(&elmstuff)?;
|
||||||
|
let actual = render_module("elm", dir.path());
|
||||||
|
let expected = Some(format!("via {} ", Color::Cyan.bold().paint("🌳 v0.19.1")));
|
||||||
|
assert_eq!(expected, actual);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn folder_with_elm_file() -> io::Result<()> {
|
||||||
|
let dir = tempfile::tempdir()?;
|
||||||
|
File::create(dir.path().join("main.elm"))?.sync_all()?;
|
||||||
|
let actual = render_module("elm", dir.path());
|
||||||
|
let expected = Some(format!("via {} ", Color::Cyan.bold().paint("🌳 v0.19.1")));
|
||||||
|
assert_eq!(expected, actual);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
@ -6,6 +6,7 @@ mod conda;
|
|||||||
mod crystal;
|
mod crystal;
|
||||||
mod directory;
|
mod directory;
|
||||||
mod dotnet;
|
mod dotnet;
|
||||||
|
mod elm;
|
||||||
mod env_var;
|
mod env_var;
|
||||||
mod git_branch;
|
mod git_branch;
|
||||||
mod git_commit;
|
mod git_commit;
|
||||||
@ -51,6 +52,7 @@ pub fn handle<'a>(module: &str, context: &'a Context) -> Option<Module<'a>> {
|
|||||||
"conda" => conda::module(context),
|
"conda" => conda::module(context),
|
||||||
"directory" => directory::module(context),
|
"directory" => directory::module(context),
|
||||||
"dotnet" => dotnet::module(context),
|
"dotnet" => dotnet::module(context),
|
||||||
|
"elm" => elm::module(context),
|
||||||
"env_var" => env_var::module(context),
|
"env_var" => env_var::module(context),
|
||||||
"git_branch" => git_branch::module(context),
|
"git_branch" => git_branch::module(context),
|
||||||
"git_commit" => git_commit::module(context),
|
"git_commit" => git_commit::module(context),
|
||||||
|
@ -37,6 +37,10 @@ pub fn exec_cmd(cmd: &str, args: &[&str]) -> Option<CommandOutput> {
|
|||||||
_ => format!("{} {}", cmd, args.join(" ")),
|
_ => format!("{} {}", cmd, args.join(" ")),
|
||||||
};
|
};
|
||||||
match command.as_str() {
|
match command.as_str() {
|
||||||
|
"elm --version" => Some(CommandOutput {
|
||||||
|
stdout: String::from("0.19.1"),
|
||||||
|
stderr: String::default(),
|
||||||
|
}),
|
||||||
"node --version" => Some(CommandOutput {
|
"node --version" => Some(CommandOutput {
|
||||||
stdout: String::from("v12.0.0"),
|
stdout: String::from("v12.0.0"),
|
||||||
stderr: String::default(),
|
stderr: String::default(),
|
||||||
|
Loading…
Reference in New Issue
Block a user