Add segment structure and logic
This commit is contained in:
parent
41ee54933b
commit
e2ba7a1354
|
@ -1,2 +1,12 @@
|
|||
/target
|
||||
**/*.rs.bk
|
||||
# will have compiled files and executables
|
||||
/target/
|
||||
|
||||
# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
|
||||
# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
|
||||
Cargo.lock
|
||||
|
||||
# These are backup files generated by rustfmt
|
||||
**/*.rs.bk
|
||||
|
||||
# VSCode configuration
|
||||
.vscode/
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Debug executable 'starship'",
|
||||
"cargo": {
|
||||
"args": [
|
||||
"build",
|
||||
"--bin=starship",
|
||||
"--package=starship"
|
||||
],
|
||||
"filter": {
|
||||
"name": "starship",
|
||||
"kind": "bin"
|
||||
}
|
||||
},
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}"
|
||||
},
|
||||
{
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Debug unit tests in executable 'starship'",
|
||||
"cargo": {
|
||||
"args": [
|
||||
"test",
|
||||
"--no-run",
|
||||
"--bin=starship",
|
||||
"--package=starship"
|
||||
],
|
||||
"filter": {
|
||||
"name": "starship",
|
||||
"kind": "bin"
|
||||
}
|
||||
},
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
<h3 align="center">Starship 🌠🚀</h3>
|
||||
<h3 align="center">Starship ✨🚀</h3>
|
||||
<p align="center">The cross-platform prompt for astronauts.</p>
|
||||
|
||||
---
|
||||
|
|
20
src/char.rs
20
src/char.rs
|
@ -1,20 +0,0 @@
|
|||
use std::env;
|
||||
use ansi_term::Color;
|
||||
|
||||
pub fn display() {
|
||||
let PROMPT_CHAR = "➜ ";
|
||||
let COLOR_SUCCESS = Color::Green;
|
||||
let COLOR_FAILURE = Color::Red;
|
||||
|
||||
let color = match env::var_os("status") {
|
||||
None | "0" => COLOR_SUCCESS,
|
||||
_ => COLOR_FAILURE
|
||||
};
|
||||
|
||||
// let color = match env::var("status") {
|
||||
// Ok("0") | _ => COLOR_SUCCESS,
|
||||
// Ok("1") => COLOR_FAILURE
|
||||
// };
|
||||
|
||||
print!("{}", color.paint(PROMPT_CHAR));
|
||||
}
|
21
src/main.rs
21
src/main.rs
|
@ -1,9 +1,19 @@
|
|||
#[macro_use]
|
||||
extern crate clap;
|
||||
use clap::App;
|
||||
use std::io;
|
||||
extern crate ansi_term;
|
||||
|
||||
mod char;
|
||||
mod modules;
|
||||
mod print;
|
||||
|
||||
use ansi_term::Style;
|
||||
use clap::App;
|
||||
|
||||
pub struct Segment {
|
||||
style: Style,
|
||||
value: String,
|
||||
prefix: Option<Box<Segment>>,
|
||||
suffix: Option<Box<Segment>>,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
App::new("Starship")
|
||||
|
@ -12,9 +22,8 @@ fn main() {
|
|||
.version(crate_version!())
|
||||
// pull the authors from Cargo.toml
|
||||
.author(crate_authors!())
|
||||
.after_help("https://github.com/matchai/starship")
|
||||
.get_matches();
|
||||
|
||||
prompt::char();
|
||||
// let stdout = io::stdout();
|
||||
// let mut handle = io::BufWriter::new(stdout);
|
||||
print::prompt();
|
||||
}
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
use crate::Segment;
|
||||
use ansi_term::{Color, Style};
|
||||
use std::env;
|
||||
|
||||
pub fn segment() -> Segment {
|
||||
const PROMPT_CHAR: &str = "➜ ";
|
||||
const COLOR_SUCCESS: Color = Color::Green;
|
||||
const COLOR_FAILURE: Color = Color::Red;
|
||||
|
||||
let default_prefix = Segment {
|
||||
value: String::from("testPrefix"),
|
||||
style: Style::default(),
|
||||
prefix: None,
|
||||
suffix: None,
|
||||
};
|
||||
|
||||
let color;
|
||||
if let Ok(status) = env::var("status") {
|
||||
if status == "0" {
|
||||
color = COLOR_SUCCESS;
|
||||
} else {
|
||||
color = COLOR_FAILURE;
|
||||
}
|
||||
} else {
|
||||
panic!("No status environment variable provided");
|
||||
}
|
||||
|
||||
Segment {
|
||||
prefix: Some(Box::new(default_prefix)),
|
||||
value: String::from(PROMPT_CHAR),
|
||||
style: Style::new().fg(color),
|
||||
suffix: None,
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
mod char;
|
||||
|
||||
use crate::Segment;
|
||||
|
||||
pub fn handle(module: &str) -> Segment {
|
||||
match module {
|
||||
"char" => char::segment(),
|
||||
|
||||
_ => panic!("Unknown module: {}", module),
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
use crate::modules;
|
||||
use crate::Segment;
|
||||
|
||||
pub fn prompt() {
|
||||
let default_prompt = vec!["char"];
|
||||
|
||||
for module in default_prompt {
|
||||
let segment = modules::handle(module);
|
||||
print_segment(segment);
|
||||
}
|
||||
}
|
||||
|
||||
fn print_segment(segment: Segment) {
|
||||
let Segment {
|
||||
prefix,
|
||||
value,
|
||||
style,
|
||||
suffix,
|
||||
} = segment;
|
||||
|
||||
if let Some(prefix) = prefix {
|
||||
print_segment(*prefix);
|
||||
}
|
||||
|
||||
print!("{}", style.paint(value));
|
||||
|
||||
if let Some(suffix) = suffix {
|
||||
print_segment(*suffix);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue