feat: New config relays command to set the default fallbacks relays
Signed-off-by: Awiteb <a@4rs.nl>
This commit is contained in:
@@ -12,6 +12,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
- New `patch send` command to send patches - by Awiteb
|
- New `patch send` command to send patches - by Awiteb
|
||||||
- Add `alt` tag to the git issue - by Awiteb
|
- Add `alt` tag to the git issue - by Awiteb
|
||||||
- Add `description` tag to the patch - by Awiteb
|
- Add `description` tag to the patch - by Awiteb
|
||||||
|
- New `config pow` command to set the default PoW difficulty - by Awiteb
|
||||||
|
- New `config relays` command to set the default fallbacks relays - by Awiteb
|
||||||
|
|
||||||
### Refactor
|
### Refactor
|
||||||
|
|
||||||
|
|||||||
@@ -16,10 +16,13 @@
|
|||||||
|
|
||||||
/// `config pow` subcommand
|
/// `config pow` subcommand
|
||||||
mod pow;
|
mod pow;
|
||||||
|
/// `config relays` subcommand
|
||||||
|
mod relays;
|
||||||
|
|
||||||
use clap::Subcommand;
|
use clap::Subcommand;
|
||||||
|
|
||||||
use self::pow::PowArgs;
|
use self::pow::PowArgs;
|
||||||
|
use self::relays::RelaysArgs;
|
||||||
use super::CliOptions;
|
use super::CliOptions;
|
||||||
use crate::{cli::traits::CommandRunner, error::N34Result};
|
use crate::{cli::traits::CommandRunner, error::N34Result};
|
||||||
|
|
||||||
@@ -28,12 +31,16 @@ use crate::{cli::traits::CommandRunner, error::N34Result};
|
|||||||
pub enum ConfigSubcommands {
|
pub enum ConfigSubcommands {
|
||||||
/// Sets the default PoW difficulty (0 if not specified)
|
/// Sets the default PoW difficulty (0 if not specified)
|
||||||
Pow(PowArgs),
|
Pow(PowArgs),
|
||||||
|
/// Sets the default fallback relays if none provided. Use this relays for
|
||||||
|
/// read and write.
|
||||||
|
Relays(RelaysArgs),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CommandRunner for ConfigSubcommands {
|
impl CommandRunner for ConfigSubcommands {
|
||||||
async fn run(self, options: CliOptions) -> N34Result<()> {
|
async fn run(self, options: CliOptions) -> N34Result<()> {
|
||||||
match self {
|
match self {
|
||||||
Self::Pow(args) => args.run(options).await,
|
Self::Pow(args) => args.run(options).await,
|
||||||
|
Self::Relays(args) => args.run(options).await,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
53
src/cli/commands/config/relays.rs
Normal file
53
src/cli/commands/config/relays.rs
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
// n34 - A CLI to interact with NIP-34 and other stuff related to codes in nostr
|
||||||
|
// Copyright (C) 2025 Awiteb <a@4rs.nl>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program. If not, see <https://gnu.org/licenses/gpl-3.0.html>.
|
||||||
|
|
||||||
|
use clap::Args;
|
||||||
|
use nostr::types::RelayUrl;
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
cli::{CliOptions, traits::CommandRunner},
|
||||||
|
error::N34Result,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[derive(Args, Debug)]
|
||||||
|
pub struct RelaysArgs {
|
||||||
|
/// List of relay URLs to append to fallback relays. If empty, removes all
|
||||||
|
/// fallback relays.
|
||||||
|
relays: Vec<RelayUrl>,
|
||||||
|
/// Replace existing fallback relays instead of appending new ones.
|
||||||
|
#[arg(long = "override")]
|
||||||
|
override_relays: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CommandRunner for RelaysArgs {
|
||||||
|
async fn run(self, mut options: CliOptions) -> N34Result<()> {
|
||||||
|
// FIXME: The signer is not required here
|
||||||
|
|
||||||
|
if self.relays.is_empty() {
|
||||||
|
options.config.fallback_relays = None;
|
||||||
|
} else if self.override_relays {
|
||||||
|
options.config.fallback_relays = Some(self.relays);
|
||||||
|
} else {
|
||||||
|
let mut relays = options.config.fallback_relays.clone().unwrap_or_default();
|
||||||
|
relays.extend(self.relays);
|
||||||
|
relays.sort_unstable();
|
||||||
|
relays.dedup();
|
||||||
|
options.config.fallback_relays = Some(relays);
|
||||||
|
}
|
||||||
|
|
||||||
|
options.config.dump()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -53,13 +53,16 @@ pub enum ConfigError {
|
|||||||
pub struct CliConfig {
|
pub struct CliConfig {
|
||||||
/// Path to the configuration file (not serialized)
|
/// Path to the configuration file (not serialized)
|
||||||
#[serde(skip)]
|
#[serde(skip)]
|
||||||
path: PathBuf,
|
path: PathBuf,
|
||||||
/// Groups of repositories and relays.
|
/// Groups of repositories and relays.
|
||||||
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
||||||
pub sets: Vec<RepoRelaySet>,
|
pub sets: Vec<RepoRelaySet>,
|
||||||
/// The default PoW difficulty
|
/// The default PoW difficulty
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub pow: Option<u8>,
|
pub pow: Option<u8>,
|
||||||
|
/// List of fallback relays used if no fallback relays was provided.
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub fallback_relays: Option<Vec<RelayUrl>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A named group of repositories and relays.
|
/// A named group of repositories and relays.
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ pub mod types;
|
|||||||
|
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use clap_verbosity_flag::Verbosity;
|
use clap_verbosity_flag::Verbosity;
|
||||||
|
use types::RelayOrSet;
|
||||||
|
|
||||||
pub use self::commands::*;
|
pub use self::commands::*;
|
||||||
pub use self::config::*;
|
pub use self::config::*;
|
||||||
@@ -72,10 +73,15 @@ impl Cli {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Processes the CLI configuration and returns it if successful.
|
/// Processes the CLI configuration by applying fallback values from config if
|
||||||
|
/// needed. Returns the processed Cli configuration if successful.
|
||||||
pub fn post_cli(mut cli: Cli) -> N34Result<Cli> {
|
pub fn post_cli(mut cli: Cli) -> N34Result<Cli> {
|
||||||
if cli.options.pow.is_none() && cli.options.config.pow.is_some() {
|
cli.options.pow = cli.options.pow.or(cli.options.config.pow);
|
||||||
cli.options.pow = cli.options.config.pow;
|
|
||||||
|
if cli.options.relays.is_empty() {
|
||||||
|
if let Some(relays) = &cli.options.config.fallback_relays {
|
||||||
|
cli.options.relays = relays.iter().cloned().map(RelayOrSet::Relay).collect();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(cli)
|
Ok(cli)
|
||||||
|
|||||||
Reference in New Issue
Block a user