Skip to content

Commit

Permalink
feat: Add an Elm module (#879)
Browse files Browse the repository at this point in the history
  • Loading branch information
m0nhawk committed Feb 6, 2020
1 parent 3631822 commit d421373
Show file tree
Hide file tree
Showing 9 changed files with 157 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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(``)
Expand Down
29 changes: 29 additions & 0 deletions docs/config/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ prompt_order = [
"hg_branch",
"package",
"dotnet",
"elm",
"golang",
"haskell",
"java",
Expand Down Expand Up @@ -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.
Expand Down
23 changes: 23 additions & 0 deletions src/configs/elm.rs
Original file line number Diff line number Diff line change
@@ -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,
}
}
}
1 change: 1 addition & 0 deletions src/configs/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions src/configs/starship_root.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
1 change: 1 addition & 0 deletions src/module.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ pub const ALL_MODULES: &[&str] = &[
"conda",
"directory",
"dotnet",
"elm",
"env_var",
"git_branch",
"git_commit",
Expand Down
95 changes: 95 additions & 0 deletions src/modules/elm.rs
Original file line number Diff line number Diff line change
@@ -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(())
}
}
2 changes: 2 additions & 0 deletions src/modules/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ mod conda;
mod crystal;
mod directory;
mod dotnet;
mod elm;
mod env_var;
mod git_branch;
mod git_commit;
Expand Down Expand Up @@ -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),
Expand Down
4 changes: 4 additions & 0 deletions src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down

0 comments on commit d421373

Please sign in to comment.