mirror of
https://github.com/nushell/nushell.git
synced 2025-07-22 16:24:28 +02:00
# Description This PR standardizes updates to the config through a new `UpdateFromValue` trait. For now, this trait is private in case we need to make changes to it. Note that this PR adds some additional `ShellError` cases to create standard error messages for config errors. A follow-up PR will move usages of the old error cases to these new ones. This PR also uses `Type::custom` in lots of places (e.g., for string enums). Not sure if this is something we want to encourage. # User-Facing Changes Should be none.
92 lines
2.7 KiB
Rust
92 lines
2.7 KiB
Rust
use super::{config_update_string_enum, prelude::*};
|
|
use crate as nu_protocol;
|
|
|
|
#[derive(Clone, Copy, Debug, IntoValue, PartialEq, Eq, Serialize, Deserialize)]
|
|
pub enum HistoryFileFormat {
|
|
/// Store history as an SQLite database with additional context
|
|
Sqlite,
|
|
/// store history as a plain text file where every line is one command (without any context such as timestamps)
|
|
Plaintext,
|
|
}
|
|
|
|
impl HistoryFileFormat {
|
|
pub fn default_file_name(self) -> std::path::PathBuf {
|
|
match self {
|
|
HistoryFileFormat::Plaintext => "history.txt",
|
|
HistoryFileFormat::Sqlite => "history.sqlite3",
|
|
}
|
|
.into()
|
|
}
|
|
}
|
|
|
|
impl FromStr for HistoryFileFormat {
|
|
type Err = &'static str;
|
|
|
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
|
match s.to_ascii_lowercase().as_str() {
|
|
"sqlite" => Ok(Self::Sqlite),
|
|
"plaintext" => Ok(Self::Plaintext),
|
|
_ => Err("'sqlite' or 'plaintext'"),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl UpdateFromValue for HistoryFileFormat {
|
|
fn update(&mut self, value: &Value, path: &mut ConfigPath, errors: &mut ConfigErrors) {
|
|
config_update_string_enum(self, value, path, errors)
|
|
}
|
|
}
|
|
|
|
#[derive(Clone, Copy, Debug, IntoValue, PartialEq, Eq, Serialize, Deserialize)]
|
|
pub struct HistoryConfig {
|
|
pub max_size: i64,
|
|
pub sync_on_enter: bool,
|
|
pub file_format: HistoryFileFormat,
|
|
pub isolation: bool,
|
|
}
|
|
|
|
impl HistoryConfig {
|
|
pub fn file_path(&self) -> Option<std::path::PathBuf> {
|
|
nu_path::nu_config_dir().map(|mut history_path| {
|
|
history_path.push(self.file_format.default_file_name());
|
|
history_path.into()
|
|
})
|
|
}
|
|
}
|
|
|
|
impl Default for HistoryConfig {
|
|
fn default() -> Self {
|
|
Self {
|
|
max_size: 100_000,
|
|
sync_on_enter: true,
|
|
file_format: HistoryFileFormat::Plaintext,
|
|
isolation: false,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl UpdateFromValue for HistoryConfig {
|
|
fn update<'a>(
|
|
&mut self,
|
|
value: &'a Value,
|
|
path: &mut ConfigPath<'a>,
|
|
errors: &mut ConfigErrors,
|
|
) {
|
|
let Value::Record { val: record, .. } = value else {
|
|
errors.type_mismatch(path, Type::record(), value);
|
|
return;
|
|
};
|
|
|
|
for (col, val) in record.iter() {
|
|
let path = &mut path.push(col);
|
|
match col.as_str() {
|
|
"isolation" => self.isolation.update(val, path, errors),
|
|
"sync_on_enter" => self.sync_on_enter.update(val, path, errors),
|
|
"max_size" => self.max_size.update(val, path, errors),
|
|
"file_format" => self.file_format.update(val, path, errors),
|
|
_ => errors.unknown_option(path, val),
|
|
}
|
|
}
|
|
}
|
|
}
|