-
Notifications
You must be signed in to change notification settings - Fork 286
config impl (pt.1) #1550
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
config impl (pt.1) #1550
Conversation
@spenserblack I'm sorry for pinging you that many times... I opened new PR Current problem is config is not spawning at $XDG_CONFIG_HOME, but it spawns folder. I am not able to check how does config parsed because is not created. Waiting for your answer, thx |
No worries.
Since you're using serde, you should be able to read the config from a string. Or a reader type that uses a string. I'd honestly use that for testing. You can use Since the CLI type implements I'd recommend putting the tests and test config file into |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
See review comment. I think it should help you figure out why the config file isn't being created.
i think i should write a todo with what are my plans on customisation with config config sample:
|
Nah, we won't get any good customization if we just parse config as CLI arguments. I reverted all commits I am looking forward to CrabFetch approach. All customisation made by configuration file, and CLI just lets you some minimal settings. @spenserblack what's your opinion on that? |
Could you explain this a bit more? You hint at overriding logos per-language in #1550 (comment), which wouldn't work if config and CLI are identical. Is that the main issue, or are there others?
Each repository is different, and can require different options. For example, if a repository has a logo, show that with |
OK, I've just reread the idea that was documented in #745. I had kind of forgotten the original intent of that issue 😅 I've noticed that the original issue body was mainly focusing on display configuration options. This makes sense to me, since those are the types of things that I'd likely only want to set once, not per-repo. Also, some options would be kind of awkward to set via the CLI, like if I was trying to set Nerd Font icons for the info lines. So, yeah, I'm backtracking on the config file being a 1:1 with the CLI. Instead, we should focus on a limited set of options that we're very confident would only be set once, regardless of repo. And also some options that may work best in a config file instead of as CLI arguments. @o2sh Thoughts? |
Those could be key-value separator, number separator, nerd-fonts switch and natural colors (use colors set by terminal) switch (to be implemented). Im working on those and possibly finish in just few hours. |
That's going to be caused by clap, the library for argument parsing. It's reading the next argument after There's perhaps an option that would force clap to take whatever argument is next, regardless of format. |
AYO I MADE BASE FOR CONFIG!!1! |
@spenserblack I got one annoying error with config file - values MUST be set there, otherwise onefetch is crashing |
I think the easiest thing to do would be to just wrap them all in Also, ideally, let's not remove options from the CLI. Here's roughly how shared options should be resolved. let opt = cli.opt.or(config.opt).unwrap_or(default_opt); Check out the huge amount of helper methods defined on |
i dont really think someone would like to override such things like separators from CLI by the way, check latest commit, i did wrap values on Option, but code seems kinda idiotic imo |
@spenserblack i could not really find why ":" is hardcoded as separator, do you have any ideas? |
It seems to compile, finally |
Lmfao it thinks |
@spenserblack I experienced some troubles with writing config - the default path is EMPTY. I set it in |
Yeah, you're going to have to combine it with |
hm @spenserblack something odd happens. it cant unwrap to default because the value is PRESENT, but it is an empty path. i cannot figure out the cause of this problem |
src/config.rs
Outdated
} | ||
} | ||
|
||
pub fn write_default<P>(path: P) -> Result<()> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If you refactor this to write(&self, path)
, then we can call ::default().write("path")
instead. A bonus from this is that we're already set up to write other configs, for example if we needed to dump the config for debugging.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done;
i also think you found my commits chaotic and weird, i will recommit in more pretty way a bit later
🤔 I'll have to look into where that's happening, but |
src/main.rs
Outdated
if cli_options.config.generate_config { | ||
// what the actual FUCK is happening here? | ||
// why default path is EMPTY? | ||
return ConfigOptions::write_default(&cli_options.config.config_path.unwrap_or_default()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
At, here it is, if I understand your problem correctly. Don't do .unwrap_or_default()
, do .unwrap_or_else(|| dirs::config_path().expect("config path to exist")
.
Edit: actually, write()
, rather than using expect()
, you can return a Result::Err
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Option::<PathBuf>::unwrap_or_default()
is equivalent to
let path_buf = match config_path {
Some(p) => p,
None => PathBuf::default(),
};
I'm thinking you were expecting the default PathBuf
as defined in your Default
implementation, instead of the PathBuf::default()
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
exactly what i expected to get, is it supposed to work like that or it is a bug?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm pretty sure PathBuf::default()
is supposed to return an empty PathBuf
, if that's what you're asking.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, I mean why does unwrap_or_default
return PathBuf::default()
and not ConfigCliOptions::default().config_path
src/info/mod.rs
Outdated
Self { | ||
title: None, | ||
info_fields: Vec::new(), | ||
// I have totally NO idea how to properly override values | ||
// if cli_options.info.disabled_fields is NOT type of Option<T> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@spenserblack not sure if i should wrap all types into Option <T>
as i suppose this would require major changes in code but i cant see another way to override values
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Check out these docs for telling serde what the value should default to if it's not available: https://serde.rs/attr-default.html
That way you don't have to wrap everything in Option
and manually unwrap to a default.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
isn't this should be done with clap rather than serde? we are overriding config with cli, so rather clap should default to config value
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hm, yes, clap also provide default_value
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tested in last commit. Currently I got vectors concatenation instead of overwrite, and clap throws error if --disabled-fields
is not set with CLI. I think wrap into Option
would be better decision
@spenserblack I tried to implement parameters override but without wrapping into |
This reverts commit c4fdd83.
Yep as I expected, wrapping into let disabled_fields = merge_with_cli(/* Value to merge */)
// or maybe CliOptions::merge? Tho I also must decide whether to merge entire struct or just one value... Anyway I'm on final stretch and this PR is going to be ready to get merged really soon |
@o2sh ready to merge (just will have to recommit in prettier way), and I would like to get some advices on my code |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nothing interesting
Goals
Implements advanced customisation with config file in toml format. This pull request (pt.1) aims to implement just basic configuration, and pt.2 will go much deeper with it.
Resolves #745
Todo
(requires major changes in logic)
(ascii/pic logo, color, etc..)
upd: i doubt functions 'custom' are really necessary