feat: split headings into local and global
Signed-off-by: kjuulh <contact@kjuulh.io>
This commit is contained in:
parent
ccb026365a
commit
aa74c13049
@ -6,7 +6,7 @@ use std::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
use anyhow::Context;
|
use anyhow::Context;
|
||||||
use clap::{Parser, Subcommand};
|
use clap::{Args, Parser, Subcommand};
|
||||||
use serde::{de::DeserializeOwned, Deserialize, Serialize};
|
use serde::{de::DeserializeOwned, Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::ui::{ConsoleUi, DynUi};
|
use crate::ui::{ConsoleUi, DynUi};
|
||||||
@ -14,25 +14,8 @@ use crate::ui::{ConsoleUi, DynUi};
|
|||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
#[command(author, version, about, long_about = None)]
|
#[command(author, version, about, long_about = None)]
|
||||||
pub struct Command {
|
pub struct Command {
|
||||||
/// token is the personal access token from gitea.
|
#[command(flatten)]
|
||||||
#[arg(
|
global: GlobalArgs,
|
||||||
env = "CUDDLE_PLEASE_TOKEN",
|
|
||||||
long,
|
|
||||||
long_help = "token is the personal access token from gitea. It requires at least repository write access, it isn't required by default, but for most usecases the flow will fail without it",
|
|
||||||
global = true
|
|
||||||
)]
|
|
||||||
token: Option<String>,
|
|
||||||
|
|
||||||
/// Which repository to publish against. If not supplied remote url will be used.
|
|
||||||
#[arg(long, global = true)]
|
|
||||||
repo_url: Option<String>,
|
|
||||||
|
|
||||||
/// which source directory to use, if not set `std::env::current_dir` is used instead.
|
|
||||||
#[arg(long, global = true)]
|
|
||||||
source: Option<PathBuf>,
|
|
||||||
|
|
||||||
#[arg(long, global = true)]
|
|
||||||
config_stdin: bool,
|
|
||||||
|
|
||||||
#[command(subcommand)]
|
#[command(subcommand)]
|
||||||
commands: Option<Commands>,
|
commands: Option<Commands>,
|
||||||
@ -44,6 +27,44 @@ pub struct Command {
|
|||||||
stdin: Option<Arc<Mutex<dyn Fn() -> anyhow::Result<String> + Send + Sync + 'static>>>,
|
stdin: Option<Arc<Mutex<dyn Fn() -> anyhow::Result<String> + Send + Sync + 'static>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Args)]
|
||||||
|
struct GlobalArgs {
|
||||||
|
/// token is the personal access token from gitea.
|
||||||
|
#[arg(
|
||||||
|
env = "CUDDLE_PLEASE_TOKEN",
|
||||||
|
long,
|
||||||
|
long_help = "token is the personal access token from gitea. It requires at least repository write access, it isn't required by default, but for most usecases the flow will fail without it",
|
||||||
|
global = true,
|
||||||
|
group = "global",
|
||||||
|
help_heading = "Global"
|
||||||
|
)]
|
||||||
|
token: Option<String>,
|
||||||
|
|
||||||
|
/// Which repository to publish against. If not supplied remote url will be used.
|
||||||
|
#[arg(long, global = true, group = "global", help_heading = "Global")]
|
||||||
|
repo_url: Option<String>,
|
||||||
|
|
||||||
|
/// which source directory to use, if not set `std::env::current_dir` is used instead.
|
||||||
|
#[arg(long, global = true, group = "global", help_heading = "Global")]
|
||||||
|
source: Option<PathBuf>,
|
||||||
|
|
||||||
|
/// Inject configuration from stdin
|
||||||
|
#[arg(
|
||||||
|
long,
|
||||||
|
global = true,
|
||||||
|
group = "global",
|
||||||
|
help_heading = "Global",
|
||||||
|
long_help = "inject via stdin
|
||||||
|
cat <<EOF | cuddle-please --config-stdin
|
||||||
|
something
|
||||||
|
something
|
||||||
|
something
|
||||||
|
EOF
|
||||||
|
config-stdin will consume stdin until the channel is closed via. EOF"
|
||||||
|
)]
|
||||||
|
config_stdin: bool,
|
||||||
|
}
|
||||||
|
|
||||||
impl Command {
|
impl Command {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
let args = std::env::args();
|
let args = std::env::args();
|
||||||
@ -99,8 +120,8 @@ impl Command {
|
|||||||
|
|
||||||
pub fn execute(self, current_dir: Option<&Path>) -> anyhow::Result<()> {
|
pub fn execute(self, current_dir: Option<&Path>) -> anyhow::Result<()> {
|
||||||
// 1. Parse the current directory
|
// 1. Parse the current directory
|
||||||
let current_dir = get_current_path(current_dir, self.source.clone())?;
|
let current_dir = get_current_path(current_dir, self.global.source.clone())?;
|
||||||
let stdin = if self.config_stdin {
|
let stdin = if self.global.config_stdin {
|
||||||
if let Some(stdin_fn) = self.stdin.clone() {
|
if let Some(stdin_fn) = self.stdin.clone() {
|
||||||
let output = (stdin_fn.lock().unwrap().deref())();
|
let output = (stdin_fn.lock().unwrap().deref())();
|
||||||
Some(output.unwrap())
|
Some(output.unwrap())
|
||||||
@ -113,7 +134,7 @@ impl Command {
|
|||||||
|
|
||||||
match &self.commands {
|
match &self.commands {
|
||||||
Some(Commands::Config { command }) => match command {
|
Some(Commands::Config { command }) => match command {
|
||||||
ConfigCommand::List {} => {
|
ConfigCommand::List { .. } => {
|
||||||
tracing::debug!("running command: config list");
|
tracing::debug!("running command: config list");
|
||||||
let _config = self.get_config(current_dir.as_path(), stdin)?;
|
let _config = self.get_config(current_dir.as_path(), stdin)?;
|
||||||
|
|
||||||
@ -149,6 +170,7 @@ impl Command {
|
|||||||
|
|
||||||
#[derive(Debug, Clone, Subcommand)]
|
#[derive(Debug, Clone, Subcommand)]
|
||||||
enum Commands {
|
enum Commands {
|
||||||
|
/// Config is mostly used for debugging the final config output
|
||||||
Config {
|
Config {
|
||||||
#[command(subcommand)]
|
#[command(subcommand)]
|
||||||
command: ConfigCommand,
|
command: ConfigCommand,
|
||||||
@ -156,7 +178,11 @@ enum Commands {
|
|||||||
}
|
}
|
||||||
#[derive(Subcommand, Debug, Clone)]
|
#[derive(Subcommand, Debug, Clone)]
|
||||||
enum ConfigCommand {
|
enum ConfigCommand {
|
||||||
List {},
|
/// List will list the final configuration
|
||||||
|
List {
|
||||||
|
#[arg(long)]
|
||||||
|
someArg: String,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_current_path(
|
fn get_current_path(
|
||||||
|
Loading…
Reference in New Issue
Block a user