mirror of
https://github.com/starship/starship.git
synced 2026-06-23 02:05:51 +07:00
feat: Add configuration for add_newline (#116)
- Replace TableExt with a Config trait that extends toml::value::Table Add configuration for add_newline - add_newline is a root-level configuration value. When set to false, the initial newline before the prompt is removed.
This commit is contained in:
+19
-21
@@ -2,25 +2,33 @@ use crate::utils;
|
||||
use std::env;
|
||||
|
||||
use dirs::home_dir;
|
||||
use toml::value::Table;
|
||||
|
||||
pub struct Config {
|
||||
data: toml::value::Table,
|
||||
pub trait Config {
|
||||
fn initialize() -> Table;
|
||||
fn config_from_file() -> Option<Table>;
|
||||
fn get_module_config(&self, module_name: &str) -> Option<&Table>;
|
||||
|
||||
// Config accessor methods
|
||||
fn get_as_bool(&self, key: &str) -> Option<bool>;
|
||||
fn get_as_str(&self, key: &str) -> Option<&str>;
|
||||
|
||||
// Internal implementation for accessors
|
||||
fn get_config(&self, key: &str) -> Option<&toml::value::Value>;
|
||||
}
|
||||
|
||||
impl Config {
|
||||
impl Config for Table {
|
||||
/// Initialize the Config struct
|
||||
pub fn initialize() -> Config {
|
||||
if let Some(file_data) = Config::config_from_file() {
|
||||
return Config { data: file_data };
|
||||
fn initialize() -> Table {
|
||||
if let Some(file_data) = Table::config_from_file() {
|
||||
return file_data;
|
||||
}
|
||||
|
||||
Config {
|
||||
data: toml::value::Table::new(),
|
||||
}
|
||||
Table::new()
|
||||
}
|
||||
|
||||
/// Create a config from a starship configuration file
|
||||
fn config_from_file() -> Option<toml::value::Table> {
|
||||
fn config_from_file() -> Option<Table> {
|
||||
let file_path = match env::var("STARSHIP_CONFIG") {
|
||||
Ok(path) => {
|
||||
// Use $STARSHIP_CONFIG as the config path if available
|
||||
@@ -55,9 +63,8 @@ impl Config {
|
||||
}
|
||||
|
||||
/// Get the subset of the table for a module by its name
|
||||
pub fn get_module_config(&self, module_name: &str) -> Option<&toml::value::Table> {
|
||||
fn get_module_config(&self, module_name: &str) -> Option<&toml::value::Table> {
|
||||
let module_config = self
|
||||
.data
|
||||
.get(module_name)
|
||||
.map(toml::Value::as_table)
|
||||
.unwrap_or(None);
|
||||
@@ -74,16 +81,7 @@ impl Config {
|
||||
|
||||
module_config
|
||||
}
|
||||
}
|
||||
|
||||
/// Extends `toml::value::Table` with useful methods
|
||||
pub trait TableExt {
|
||||
fn get_config(&self, key: &str) -> Option<&toml::value::Value>;
|
||||
fn get_as_bool(&self, key: &str) -> Option<bool>;
|
||||
fn get_as_str(&self, key: &str) -> Option<&str>;
|
||||
}
|
||||
|
||||
impl TableExt for toml::value::Table {
|
||||
/// Get the config value for a given key
|
||||
fn get_config(&self, key: &str) -> Option<&toml::value::Value> {
|
||||
log::trace!("Looking for config key \"{}\"", key);
|
||||
|
||||
+3
-3
@@ -1,4 +1,4 @@
|
||||
use crate::config::{Config, TableExt};
|
||||
use crate::config::Config;
|
||||
use crate::module::Module;
|
||||
|
||||
use clap::ArgMatches;
|
||||
@@ -13,7 +13,7 @@ use std::path::PathBuf;
|
||||
/// of the prompt.
|
||||
pub struct Context<'a> {
|
||||
/// The deserialized configuration map from the user's `starship.toml` file.
|
||||
pub config: Config,
|
||||
pub config: toml::value::Table,
|
||||
|
||||
/// The current working directory that starship is being called in.
|
||||
pub current_dir: PathBuf,
|
||||
@@ -51,7 +51,7 @@ impl<'a> Context<'a> {
|
||||
where
|
||||
T: Into<PathBuf>,
|
||||
{
|
||||
let config = Config::initialize();
|
||||
let config = toml::value::Table::initialize();
|
||||
|
||||
// TODO: Currently gets the physical directory. Get the logical directory.
|
||||
let current_dir = Context::expand_tilde(dir.into());
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
use crate::config::TableExt;
|
||||
use crate::config::Config;
|
||||
use crate::segment::Segment;
|
||||
use ansi_term::Style;
|
||||
use ansi_term::{ANSIString, ANSIStrings};
|
||||
|
||||
+5
-1
@@ -2,6 +2,7 @@ use clap::ArgMatches;
|
||||
use rayon::prelude::*;
|
||||
use std::io::{self, Write};
|
||||
|
||||
use crate::config::Config;
|
||||
use crate::context::Context;
|
||||
use crate::module::Module;
|
||||
use crate::modules;
|
||||
@@ -23,12 +24,15 @@ const PROMPT_ORDER: &[&str] = &[
|
||||
|
||||
pub fn prompt(args: ArgMatches) {
|
||||
let context = Context::new(args);
|
||||
let config = &context.config;
|
||||
|
||||
let stdout = io::stdout();
|
||||
let mut handle = stdout.lock();
|
||||
|
||||
// Write a new line before the prompt
|
||||
writeln!(handle).unwrap();
|
||||
if config.get_as_bool("add_newline") != Some(false) {
|
||||
writeln!(handle).unwrap();
|
||||
}
|
||||
|
||||
let modules = PROMPT_ORDER
|
||||
.par_iter()
|
||||
|
||||
Reference in New Issue
Block a user