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
|
||||
|
||||
- Prompt character turns red if the last command exits with non-zero code
|
||||
- Current Elm version (`🌳`)
|
||||
- Current Go version (`🐹`)
|
||||
- Current Haskell version (`λ`)
|
||||
- Current Java version(`☕`)
|
||||
|
@ -102,6 +102,7 @@ prompt_order = [
|
||||
"hg_branch",
|
||||
"package",
|
||||
"dotnet",
|
||||
"elm",
|
||||
"golang",
|
||||
"haskell",
|
||||
"java",
|
||||
@ -405,6 +406,34 @@ style = "green"
|
||||
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
|
||||
|
||||
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 directory;
|
||||
pub mod dotnet;
|
||||
pub mod elm;
|
||||
pub mod env_var;
|
||||
pub mod git_branch;
|
||||
pub mod git_commit;
|
||||
|
@ -30,6 +30,7 @@ impl<'a> RootModuleConfig<'a> for StarshipRootConfig<'a> {
|
||||
// ↓ Toolchain version modules ↓
|
||||
// (Let's keep these sorted alphabetically)
|
||||
"dotnet",
|
||||
"elm",
|
||||
"golang",
|
||||
"haskell",
|
||||
"java",
|
||||
|
@ -17,6 +17,7 @@ pub const ALL_MODULES: &[&str] = &[
|
||||
"conda",
|
||||
"directory",
|
||||
"dotnet",
|
||||
"elm",
|
||||
"env_var",
|
||||
"git_branch",
|
||||
"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 directory;
|
||||
mod dotnet;
|
||||
mod elm;
|
||||
mod env_var;
|
||||
mod git_branch;
|
||||
mod git_commit;
|
||||
@ -51,6 +52,7 @@ pub fn handle<'a>(module: &str, context: &'a Context) -> Option<Module<'a>> {
|
||||
"conda" => conda::module(context),
|
||||
"directory" => directory::module(context),
|
||||
"dotnet" => dotnet::module(context),
|
||||
"elm" => elm::module(context),
|
||||
"env_var" => env_var::module(context),
|
||||
"git_branch" => git_branch::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(" ")),
|
||||
};
|
||||
match command.as_str() {
|
||||
"elm --version" => Some(CommandOutput {
|
||||
stdout: String::from("0.19.1"),
|
||||
stderr: String::default(),
|
||||
}),
|
||||
"node --version" => Some(CommandOutput {
|
||||
stdout: String::from("v12.0.0"),
|
||||
stderr: String::default(),
|
||||
|
Loading…
Reference in New Issue
Block a user