diff --git a/Cargo.lock b/Cargo.lock index cf30a0a1f..4372916fd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -694,6 +694,7 @@ checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3" dependencies = [ "autocfg", "hashbrown", + "serde", ] [[package]] @@ -1627,7 +1628,7 @@ dependencies = [ [[package]] name = "starship_module_config_derive" -version = "0.1.2" +version = "0.1.3" dependencies = [ "proc-macro2", "quote 1.0.9", diff --git a/Cargo.toml b/Cargo.toml index adb3360d2..9c7939b7c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -61,7 +61,7 @@ term_size = "0.3.2" quick-xml = "0.22.0" rand = "0.8.3" serde = { version = "1.0.125", features = ["derive"] } -indexmap = "1.6.2" +indexmap = { version ="1.6.2", features = ["serde"] } notify-rust = { version = "4.3.0", optional = true } semver = "0.11.0" which = "4.1.0" diff --git a/docs/config/README.md b/docs/config/README.md index a752a5f10..f7b8bef42 100644 --- a/docs/config/README.md +++ b/docs/config/README.md @@ -3,7 +3,7 @@ To get started configuring starship, create the following file: `~/.config/starship.toml`. ```sh -mkdir -p ~/.config && touch ~/.config/starship.toml +mkdir -p ~/.config && starship print-config --default > ~/.config/starship.toml ``` All configuration for starship is done in this [TOML](https://github.com/toml-lang/toml) file: diff --git a/src/config.rs b/src/config.rs index f8a0a3a13..0e6a35df5 100644 --- a/src/config.rs +++ b/src/config.rs @@ -2,6 +2,7 @@ use crate::configs::StarshipRootConfig; use crate::utils; use ansi_term::{Color, Style}; use indexmap::IndexMap; +use serde::Serialize; use std::clone::Clone; use std::collections::HashMap; @@ -174,7 +175,7 @@ where /// A wrapper around `Vec` that implements `ModuleConfig`, and either /// accepts a value of type `T` or a list of values of type `T`. -#[derive(Clone, Default)] +#[derive(Clone, Default, Serialize)] pub struct VecOr(pub Vec); impl<'a, T> ModuleConfig<'a> for VecOr @@ -479,7 +480,7 @@ mod tests { #[test] fn test_load_config() { - #[derive(Clone, ModuleConfig)] + #[derive(Clone, Default, ModuleConfig)] struct TestConfig<'a> { pub symbol: &'a str, pub disabled: bool, @@ -505,13 +506,13 @@ mod tests { #[test] fn test_load_nested_config() { - #[derive(Clone, ModuleConfig)] + #[derive(Clone, Default, ModuleConfig)] struct TestConfig<'a> { pub untracked: SegmentDisplayConfig<'a>, pub modified: SegmentDisplayConfig<'a>, } - #[derive(PartialEq, Debug, Clone, ModuleConfig)] + #[derive(PartialEq, Debug, Clone, Default, ModuleConfig)] struct SegmentDisplayConfig<'a> { pub value: &'a str, pub style: Style, @@ -552,7 +553,7 @@ mod tests { #[test] fn test_load_optional_config() { - #[derive(Clone, ModuleConfig)] + #[derive(Clone, Default, ModuleConfig)] struct TestConfig<'a> { pub optional: Option<&'a str>, pub hidden: Option<&'a str>, @@ -573,7 +574,7 @@ mod tests { #[test] fn test_load_enum_config() { - #[derive(Clone, ModuleConfig)] + #[derive(Clone, Default, ModuleConfig)] struct TestConfig { pub switch_a: Switch, pub switch_b: Switch, @@ -586,6 +587,12 @@ mod tests { Off, } + impl Default for Switch { + fn default() -> Self { + Self::Off + } + } + impl<'a> ModuleConfig<'a> for Switch { fn from_config(config: &'a Value) -> Option { match config.as_str()? { diff --git a/src/configs/aws.rs b/src/configs/aws.rs index adc3868e8..8cef66362 100644 --- a/src/configs/aws.rs +++ b/src/configs/aws.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; use std::collections::HashMap; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct AwsConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/battery.rs b/src/configs/battery.rs index 578fc040b..db313daa7 100644 --- a/src/configs/battery.rs +++ b/src/configs/battery.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct BatteryConfig<'a> { pub full_symbol: &'a str, pub charging_symbol: &'a str, @@ -32,7 +33,7 @@ impl<'a> Default for BatteryConfig<'a> { } } -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Default, Serialize)] pub struct BatteryDisplayConfig<'a> { pub threshold: i64, pub style: &'a str, diff --git a/src/configs/character.rs b/src/configs/character.rs index 3e7153370..19204fe3c 100644 --- a/src/configs/character.rs +++ b/src/configs/character.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct CharacterConfig<'a> { pub format: &'a str, pub success_symbol: &'a str, diff --git a/src/configs/cmake.rs b/src/configs/cmake.rs index 8b9f51c85..d225b0d90 100644 --- a/src/configs/cmake.rs +++ b/src/configs/cmake.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct CMakeConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/cmd_duration.rs b/src/configs/cmd_duration.rs index 096fbf8e1..be5d2f732 100644 --- a/src/configs/cmd_duration.rs +++ b/src/configs/cmd_duration.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct CmdDurationConfig<'a> { pub min_time: i64, pub format: &'a str, diff --git a/src/configs/conda.rs b/src/configs/conda.rs index 54e9434ef..623b4fc67 100644 --- a/src/configs/conda.rs +++ b/src/configs/conda.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct CondaConfig<'a> { pub truncation_length: usize, pub format: &'a str, diff --git a/src/configs/crystal.rs b/src/configs/crystal.rs index ae3c4da75..e5b61476e 100644 --- a/src/configs/crystal.rs +++ b/src/configs/crystal.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct CrystalConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/custom.rs b/src/configs/custom.rs index df6d03de5..bced89319 100644 --- a/src/configs/custom.rs +++ b/src/configs/custom.rs @@ -1,29 +1,22 @@ use crate::config::{ModuleConfig, VecOr}; +use serde::{self, Serialize}; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, Default, PartialEq)] -pub struct Files<'a>(pub Vec<&'a str>); - -#[derive(Clone, Default, PartialEq)] -pub struct Extensions<'a>(pub Vec<&'a str>); - -#[derive(Clone, Default, PartialEq)] -pub struct Directories<'a>(pub Vec<&'a str>); - -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct CustomConfig<'a> { pub format: &'a str, pub symbol: &'a str, pub command: &'a str, + #[serde(skip_serializing_if = "Option::is_none")] pub when: Option<&'a str>, pub shell: VecOr<&'a str>, pub description: &'a str, pub style: &'a str, pub disabled: bool, - pub files: Files<'a>, - pub extensions: Extensions<'a>, - pub directories: Directories<'a>, + pub files: Vec<&'a str>, + pub extensions: Vec<&'a str>, + pub directories: Vec<&'a str>, } impl<'a> Default for CustomConfig<'a> { @@ -37,57 +30,9 @@ impl<'a> Default for CustomConfig<'a> { description: "", style: "green bold", disabled: false, - files: Files::default(), - extensions: Extensions::default(), - directories: Directories::default(), + files: Vec::default(), + extensions: Vec::default(), + directories: Vec::default(), } } } - -impl<'a> ModuleConfig<'a> for Files<'a> { - fn from_config(config: &'a toml::Value) -> Option { - let mut files = Vec::new(); - - for item in config.as_array()? { - if let Some(file) = item.as_str() { - files.push(file); - } else { - log::warn!("Unexpected file {:?}", item); - } - } - - Some(Files(files)) - } -} - -impl<'a> ModuleConfig<'a> for Extensions<'a> { - fn from_config(config: &'a toml::Value) -> Option { - let mut extensions = Vec::new(); - - for item in config.as_array()? { - if let Some(file) = item.as_str() { - extensions.push(file); - } else { - log::warn!("Unexpected extension {:?}", item); - } - } - - Some(Extensions(extensions)) - } -} - -impl<'a> ModuleConfig<'a> for Directories<'a> { - fn from_config(config: &'a toml::Value) -> Option { - let mut directories = Vec::new(); - - for item in config.as_array()? { - if let Some(file) = item.as_str() { - directories.push(file); - } else { - log::warn!("Unexpected directory {:?}", item); - } - } - - Some(Directories(directories)) - } -} diff --git a/src/configs/dart.rs b/src/configs/dart.rs index ef8e16bba..94f5112e4 100644 --- a/src/configs/dart.rs +++ b/src/configs/dart.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct DartConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/directory.rs b/src/configs/directory.rs index 47fa8bdcf..9f1b27ad4 100644 --- a/src/configs/directory.rs +++ b/src/configs/directory.rs @@ -1,9 +1,10 @@ use crate::config::ModuleConfig; use indexmap::IndexMap; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct DirectoryConfig<'a> { pub truncation_length: i64, pub truncate_to_repo: bool, diff --git a/src/configs/docker_context.rs b/src/configs/docker_context.rs index 7d8757d4d..b026acda9 100644 --- a/src/configs/docker_context.rs +++ b/src/configs/docker_context.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct DockerContextConfig<'a> { pub symbol: &'a str, pub style: &'a str, diff --git a/src/configs/dotnet.rs b/src/configs/dotnet.rs index 33118e7c9..05438f363 100644 --- a/src/configs/dotnet.rs +++ b/src/configs/dotnet.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct DotnetConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/elixir.rs b/src/configs/elixir.rs index 3fddbb979..9eb5b347c 100644 --- a/src/configs/elixir.rs +++ b/src/configs/elixir.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct ElixirConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/elm.rs b/src/configs/elm.rs index 4b582867b..d97cddd9c 100644 --- a/src/configs/elm.rs +++ b/src/configs/elm.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct ElmConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/env_var.rs b/src/configs/env_var.rs index 07aef6090..30ab72e95 100644 --- a/src/configs/env_var.rs +++ b/src/configs/env_var.rs @@ -1,12 +1,15 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct EnvVarConfig<'a> { pub symbol: &'a str, pub style: &'a str, + #[serde(skip_serializing_if = "Option::is_none")] pub variable: Option<&'a str>, + #[serde(skip_serializing_if = "Option::is_none")] pub default: Option<&'a str>, pub format: &'a str, pub disabled: bool, diff --git a/src/configs/erlang.rs b/src/configs/erlang.rs index 9e04105df..b0a7515ef 100644 --- a/src/configs/erlang.rs +++ b/src/configs/erlang.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct ErlangConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/gcloud.rs b/src/configs/gcloud.rs index d3f3c2028..fd291badf 100644 --- a/src/configs/gcloud.rs +++ b/src/configs/gcloud.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; use std::collections::HashMap; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct GcloudConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/git_branch.rs b/src/configs/git_branch.rs index 87ab33f1a..d9c40c9ad 100644 --- a/src/configs/git_branch.rs +++ b/src/configs/git_branch.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct GitBranchConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/git_commit.rs b/src/configs/git_commit.rs index d07a9d765..01c4c3ee3 100644 --- a/src/configs/git_commit.rs +++ b/src/configs/git_commit.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct GitCommitConfig<'a> { pub commit_hash_length: usize, pub format: &'a str, diff --git a/src/configs/git_state.rs b/src/configs/git_state.rs index 5bc214dd4..d0773dcdd 100644 --- a/src/configs/git_state.rs +++ b/src/configs/git_state.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct GitStateConfig<'a> { pub rebase: &'a str, pub merge: &'a str, diff --git a/src/configs/git_status.rs b/src/configs/git_status.rs index e2b2f8f78..9def0ca58 100644 --- a/src/configs/git_status.rs +++ b/src/configs/git_status.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct GitStatusConfig<'a> { pub format: &'a str, pub style: &'a str, diff --git a/src/configs/go.rs b/src/configs/go.rs index 9db7f28f7..c4fb3dca5 100644 --- a/src/configs/go.rs +++ b/src/configs/go.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct GoConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/helm.rs b/src/configs/helm.rs index dfa2b46be..a99ad7aba 100644 --- a/src/configs/helm.rs +++ b/src/configs/helm.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct HelmConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/hg_branch.rs b/src/configs/hg_branch.rs index c06f9a1d0..cb50afc52 100644 --- a/src/configs/hg_branch.rs +++ b/src/configs/hg_branch.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct HgBranchConfig<'a> { pub symbol: &'a str, pub style: &'a str, diff --git a/src/configs/hostname.rs b/src/configs/hostname.rs index f1e91bea0..074fabcaf 100644 --- a/src/configs/hostname.rs +++ b/src/configs/hostname.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct HostnameConfig<'a> { pub ssh_only: bool, pub trim_at: &'a str, diff --git a/src/configs/java.rs b/src/configs/java.rs index 26e1e4ed4..6de40a686 100644 --- a/src/configs/java.rs +++ b/src/configs/java.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct JavaConfig<'a> { pub disabled: bool, pub format: &'a str, diff --git a/src/configs/jobs.rs b/src/configs/jobs.rs index d98458edd..24d8e076b 100644 --- a/src/configs/jobs.rs +++ b/src/configs/jobs.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct JobsConfig<'a> { pub threshold: i64, pub format: &'a str, diff --git a/src/configs/julia.rs b/src/configs/julia.rs index 1f7f3785e..0ee98614d 100644 --- a/src/configs/julia.rs +++ b/src/configs/julia.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct JuliaConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/kotlin.rs b/src/configs/kotlin.rs index 401616f48..b609c033b 100644 --- a/src/configs/kotlin.rs +++ b/src/configs/kotlin.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct KotlinConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/kubernetes.rs b/src/configs/kubernetes.rs index 8d06d3340..04740c4f2 100644 --- a/src/configs/kubernetes.rs +++ b/src/configs/kubernetes.rs @@ -1,9 +1,10 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; use std::collections::HashMap; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct KubernetesConfig<'a> { pub symbol: &'a str, pub format: &'a str, diff --git a/src/configs/lua.rs b/src/configs/lua.rs index 592b62da9..a70e30183 100644 --- a/src/configs/lua.rs +++ b/src/configs/lua.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct LuaConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/memory_usage.rs b/src/configs/memory_usage.rs index 65afe7d20..d89283e0b 100644 --- a/src/configs/memory_usage.rs +++ b/src/configs/memory_usage.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct MemoryConfig<'a> { pub threshold: i64, pub format: &'a str, diff --git a/src/configs/mod.rs b/src/configs/mod.rs index 7f5ebf508..70a55c681 100644 --- a/src/configs/mod.rs +++ b/src/configs/mod.rs @@ -1,3 +1,8 @@ +use crate::config::ModuleConfig; +use indexmap::IndexMap; +use serde::{self, Serialize}; +use starship_module_config_derive::ModuleConfig; + pub mod aws; pub mod battery; pub mod character; @@ -57,3 +62,65 @@ pub mod vcsh; pub mod zig; pub use starship_root::*; + +#[derive(Default, Serialize, ModuleConfig, Clone)] +#[serde(default)] +pub struct FullConfig<'a> { + #[serde(flatten)] + root: starship_root::StarshipRootConfig<'a>, + aws: aws::AwsConfig<'a>, + battery: battery::BatteryDisplayConfig<'a>, + character: character::CharacterConfig<'a>, + cmake: cmake::CMakeConfig<'a>, + cmd_duration: cmd_duration::CmdDurationConfig<'a>, + conda: conda::CondaConfig<'a>, + crystal: crystal::CrystalConfig<'a>, + dart: dart::DartConfig<'a>, + directory: directory::DirectoryConfig<'a>, + docker_context: docker_context::DockerContextConfig<'a>, + dotnet: dotnet::DotnetConfig<'a>, + elixir: elixir::ElixirConfig<'a>, + elm: elm::ElmConfig<'a>, + env_var: env_var::EnvVarConfig<'a>, + erlang: erlang::ErlangConfig<'a>, + gcloud: gcloud::GcloudConfig<'a>, + git_branch: git_branch::GitBranchConfig<'a>, + git_commit: git_commit::GitCommitConfig<'a>, + git_state: git_state::GitStateConfig<'a>, + git_status: git_status::GitStatusConfig<'a>, + go: go::GoConfig<'a>, + helm: helm::HelmConfig<'a>, + hg_branch: hg_branch::HgBranchConfig<'a>, + hostname: hostname::HostnameConfig<'a>, + java: java::JavaConfig<'a>, + jobs: jobs::JobsConfig<'a>, + julia: julia::JuliaConfig<'a>, + kotlin: kotlin::KotlinConfig<'a>, + kubernetes: kubernetes::KubernetesConfig<'a>, + lua: lua::LuaConfig<'a>, + memory_usage: memory_usage::MemoryConfig<'a>, + nim: nim::NimConfig<'a>, + nix_shell: nix_shell::NixShellConfig<'a>, + nodejs: nodejs::NodejsConfig<'a>, + ocaml: ocaml::OCamlConfig<'a>, + openstack: openstack::OspConfig<'a>, + package: package::PackageConfig<'a>, + perl: perl::PerlConfig<'a>, + php: php::PhpConfig<'a>, + purescript: purescript::PureScriptConfig<'a>, + python: python::PythonConfig<'a>, + ruby: ruby::RubyConfig<'a>, + rust: rust::RustConfig<'a>, + scala: scala::ScalaConfig<'a>, + shell: shell::ShellConfig<'a>, + shlvl: shlvl::ShLvlConfig<'a>, + singularity: singularity::SingularityConfig<'a>, + status: status::StatusConfig<'a>, + swift: swift::SwiftConfig<'a>, + terraform: terraform::TerraformConfig<'a>, + time: time::TimeConfig<'a>, + username: username::UsernameConfig<'a>, + vagrant: vagrant::VagrantConfig<'a>, + zig: zig::ZigConfig<'a>, + custom: IndexMap>, +} diff --git a/src/configs/nim.rs b/src/configs/nim.rs index b10475627..bbbe90a65 100644 --- a/src/configs/nim.rs +++ b/src/configs/nim.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct NimConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/nix_shell.rs b/src/configs/nix_shell.rs index b75ae9647..e2f07ed3b 100644 --- a/src/configs/nix_shell.rs +++ b/src/configs/nix_shell.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct NixShellConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/nodejs.rs b/src/configs/nodejs.rs index 2063bdc4e..741670e35 100644 --- a/src/configs/nodejs.rs +++ b/src/configs/nodejs.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct NodejsConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/ocaml.rs b/src/configs/ocaml.rs index 1ee513306..8b1d51fe2 100644 --- a/src/configs/ocaml.rs +++ b/src/configs/ocaml.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct OCamlConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/openstack.rs b/src/configs/openstack.rs index 6863a1029..2525466af 100644 --- a/src/configs/openstack.rs +++ b/src/configs/openstack.rs @@ -1,7 +1,8 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct OspConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/package.rs b/src/configs/package.rs index ceab1566a..7fe422155 100644 --- a/src/configs/package.rs +++ b/src/configs/package.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct PackageConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/perl.rs b/src/configs/perl.rs index b53e47a4e..9aaf1ce4a 100644 --- a/src/configs/perl.rs +++ b/src/configs/perl.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct PerlConfig<'a> { pub symbol: &'a str, pub style: &'a str, diff --git a/src/configs/php.rs b/src/configs/php.rs index 5f9bdcec0..2c44141d9 100644 --- a/src/configs/php.rs +++ b/src/configs/php.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct PhpConfig<'a> { pub symbol: &'a str, pub style: &'a str, diff --git a/src/configs/purescript.rs b/src/configs/purescript.rs index 0d5788f83..a52dff799 100644 --- a/src/configs/purescript.rs +++ b/src/configs/purescript.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct PureScriptConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/python.rs b/src/configs/python.rs index c31204251..a010411c1 100644 --- a/src/configs/python.rs +++ b/src/configs/python.rs @@ -1,8 +1,9 @@ use crate::config::{ModuleConfig, VecOr}; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct PythonConfig<'a> { pub pyenv_version_name: bool, pub pyenv_prefix: &'a str, diff --git a/src/configs/ruby.rs b/src/configs/ruby.rs index 95893dcc4..f1940a85e 100644 --- a/src/configs/ruby.rs +++ b/src/configs/ruby.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct RubyConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/rust.rs b/src/configs/rust.rs index 24746f780..187e31182 100644 --- a/src/configs/rust.rs +++ b/src/configs/rust.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct RustConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/scala.rs b/src/configs/scala.rs index 4425fb197..1be54487f 100644 --- a/src/configs/scala.rs +++ b/src/configs/scala.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct ScalaConfig<'a> { pub disabled: bool, pub format: &'a str, diff --git a/src/configs/shell.rs b/src/configs/shell.rs index cd8b6d005..445c1bb9e 100644 --- a/src/configs/shell.rs +++ b/src/configs/shell.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct ShellConfig<'a> { pub format: &'a str, pub bash_indicator: &'a str, diff --git a/src/configs/shlvl.rs b/src/configs/shlvl.rs index 2f8d57a9d..48c348a93 100644 --- a/src/configs/shlvl.rs +++ b/src/configs/shlvl.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct ShLvlConfig<'a> { pub threshold: i64, pub format: &'a str, diff --git a/src/configs/singularity.rs b/src/configs/singularity.rs index b1cff01bc..ade5901f5 100644 --- a/src/configs/singularity.rs +++ b/src/configs/singularity.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct SingularityConfig<'a> { pub symbol: &'a str, pub format: &'a str, diff --git a/src/configs/starship_root.rs b/src/configs/starship_root.rs index 6bb913d43..4d26fd1ca 100644 --- a/src/configs/starship_root.rs +++ b/src/configs/starship_root.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct StarshipRootConfig<'a> { pub format: &'a str, pub scan_timeout: u64, diff --git a/src/configs/status.rs b/src/configs/status.rs index f386153e8..5673793a3 100644 --- a/src/configs/status.rs +++ b/src/configs/status.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct StatusConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/swift.rs b/src/configs/swift.rs index 0ff6079c1..4e569494d 100644 --- a/src/configs/swift.rs +++ b/src/configs/swift.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct SwiftConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/terraform.rs b/src/configs/terraform.rs index a7369409b..2b56fba94 100644 --- a/src/configs/terraform.rs +++ b/src/configs/terraform.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct TerraformConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/time.rs b/src/configs/time.rs index ad000a7c0..0ab8996f7 100644 --- a/src/configs/time.rs +++ b/src/configs/time.rs @@ -1,12 +1,14 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct TimeConfig<'a> { pub format: &'a str, pub style: &'a str, pub use_12hr: bool, + #[serde(skip_serializing_if = "Option::is_none")] pub time_format: Option<&'a str>, pub disabled: bool, pub utc_time_offset: &'a str, diff --git a/src/configs/username.rs b/src/configs/username.rs index 2b96b76b0..42c83552f 100644 --- a/src/configs/username.rs +++ b/src/configs/username.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct UsernameConfig<'a> { pub format: &'a str, pub style_root: &'a str, diff --git a/src/configs/vagrant.rs b/src/configs/vagrant.rs index 2d351ffa5..60460941f 100644 --- a/src/configs/vagrant.rs +++ b/src/configs/vagrant.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct VagrantConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configs/zig.rs b/src/configs/zig.rs index 0650b8eb8..ff47889e0 100644 --- a/src/configs/zig.rs +++ b/src/configs/zig.rs @@ -1,8 +1,9 @@ use crate::config::ModuleConfig; +use serde::Serialize; use starship_module_config_derive::ModuleConfig; -#[derive(Clone, ModuleConfig)] +#[derive(Clone, ModuleConfig, Serialize)] pub struct ZigConfig<'a> { pub format: &'a str, pub symbol: &'a str, diff --git a/src/configure.rs b/src/configure.rs index 415a1e0bc..0e51aa093 100644 --- a/src/configure.rs +++ b/src/configure.rs @@ -4,6 +4,7 @@ use std::io::ErrorKind; use std::process; use std::process::Command; +use crate::config::RootModuleConfig; use crate::config::StarshipConfig; use std::fs::File; use std::io::Write; @@ -52,6 +53,27 @@ pub fn update_configuration(name: &str, value: &str) { } } +pub fn print_configuration(use_default: bool) { + let config = if use_default { + // Get default config + let default_config = crate::configs::FullConfig::default(); + // Convert back to Value because toml can't serialize FullConfig directly + toml::value::Value::try_from(default_config).unwrap() + } else { + // Get config as toml::Value + let user_config = get_configuration(); + // Convert into FullConfig and fill in default values + let user_config = crate::configs::FullConfig::try_load(Some(&user_config)); + // Convert back to Value because toml can't serialize FullConfig directly + toml::value::Value::try_from(user_config).unwrap() + }; + + let string_config = toml::to_string_pretty(&config).unwrap(); + + println!("# Warning: This config does not include keys that have an unset value"); + println!("{}", string_config); +} + pub fn toggle_configuration(name: &str, key: &str) { if let Some(table) = get_configuration().as_table_mut() { match table.get(name) { diff --git a/src/main.rs b/src/main.rs index 977f99414..514097a7a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -131,6 +131,17 @@ fn main() { ) .arg(Arg::with_name("value").help("Value to place into that key")), ) + .subcommand( + SubCommand::with_name("print-config") + .about("Prints the computed starship configuration") + .arg( + Arg::with_name("default") + .short("d") + .long("default") + .help("Print the default instead of the computed config") + .takes_value(false), + ), + ) .subcommand( SubCommand::with_name("toggle") .about("Toggle a given starship module") @@ -208,6 +219,10 @@ fn main() { configure::edit_configuration() } } + ("print-config", Some(sub_m)) => { + let print_default = sub_m.is_present("default"); + configure::print_configuration(print_default) + } ("toggle", Some(sub_m)) => { if let Some(name) = sub_m.value_of("name") { if let Some(value) = sub_m.value_of("key") { diff --git a/src/modules/custom.rs b/src/modules/custom.rs index 19959ed72..03cf6d1b6 100644 --- a/src/modules/custom.rs +++ b/src/modules/custom.rs @@ -20,19 +20,12 @@ pub fn module<'a>(name: &str, context: &'a Context) -> Option> { ); let config = CustomConfig::load(toml_config); - let mut scan_dir = context.try_begin_scan()?; - - if !config.files.0.is_empty() { - scan_dir = scan_dir.set_files(&config.files.0); - } - if !config.extensions.0.is_empty() { - scan_dir = scan_dir.set_extensions(&config.extensions.0); - } - if !config.directories.0.is_empty() { - scan_dir = scan_dir.set_folders(&config.directories.0); - } - - let mut is_match = scan_dir.is_match(); + let mut is_match = context + .try_begin_scan()? + .set_files(&config.files) + .set_extensions(&config.extensions) + .set_folders(&config.directories) + .is_match(); if !is_match { if let Some(when) = config.when { diff --git a/starship_module_config_derive/Cargo.toml b/starship_module_config_derive/Cargo.toml index 4b9e83b75..04352616f 100644 --- a/starship_module_config_derive/Cargo.toml +++ b/starship_module_config_derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "starship_module_config_derive" -version = "0.1.2" +version = "0.1.3" edition = "2018" authors = ["Matan Kushner "] homepage = "https://starship.rs" diff --git a/starship_module_config_derive/src/lib.rs b/starship_module_config_derive/src/lib.rs index 4dd0ed7dc..8594a902a 100644 --- a/starship_module_config_derive/src/lib.rs +++ b/starship_module_config_derive/src/lib.rs @@ -18,29 +18,20 @@ fn impl_module_config(dinput: DeriveInput) -> proc_macro::TokenStream { if let syn::Data::Struct(data) = dinput.data { if let syn::Fields::Named(fields_named) = data.fields { let mut load_tokens = quote! {}; - let mut from_tokens = quote! {}; for field in fields_named.named.iter() { let ident = field.ident.as_ref().unwrap(); - let ty = &field.ty; let new_load_tokens = quote! { if let Some(config_str) = config.get(stringify!(#ident)) { new_module_config.#ident = new_module_config.#ident.load_config(config_str); } }; - let new_from_tokens = quote! { - #ident: config.get(stringify!(#ident)).and_then(<#ty>::from_config)?, - }; load_tokens = quote! { #load_tokens #new_load_tokens }; - from_tokens = quote! { - #from_tokens - #new_from_tokens - } } load_config = quote! { @@ -60,11 +51,7 @@ fn impl_module_config(dinput: DeriveInput) -> proc_macro::TokenStream { }; from_config = quote! { fn from_config(config: &'a toml::Value) -> Option { - let config = config.as_table()?; - - Some(#struct_ident { - #from_tokens - }) + Some(Self::default().load_config(config)) } }; }