#![deny(unsafe_code)]
#![allow(unused)]
mod commands {
#[cfg(feature = "beta")]
pub mod check;
#[cfg(feature = "beta")]
pub mod config;
pub mod execute;
#[cfg(feature = "beta")]
pub mod generate;
}
use commands::*;
mod exit;
use crate::exit::ExitCode;
use clientele::{
crates::clap::{Args, Parser, Subcommand},
StandardOptions,
};
use protoflow_blocks::types::Encoding;
use std::{error::Error, path::PathBuf, str::FromStr};
#[derive(Debug, Parser)]
#[command(name = "Protoflow")]
#[command(arg_required_else_help = true)]
struct Options {
#[clap(flatten)]
flags: StandardOptions,
#[command(subcommand)]
command: Option<Command>,
}
#[derive(Debug, Subcommand)]
enum Command {
#[cfg(feature = "beta")]
Config {},
#[cfg(feature = "beta")]
Check {
#[clap(default_value = "/dev/stdin")]
paths: Vec<PathBuf>,
},
Execute {
block: PathBuf,
#[clap(short = 'e', long, value_parser = parse_encoding, default_value = "text")]
encoding: Encoding,
#[clap(value_parser = parse_kv_param::<String, String>)]
params: Vec<(String, String)>,
},
#[cfg(feature = "beta")]
Generate {
path: PathBuf,
},
}
pub fn main() -> Result<(), ExitCode> {
clientele::dotenv().ok();
let args = clientele::args_os()?;
let options = Options::parse_from(args);
if options.flags.version {
println!("protoflow {}", env!("CARGO_PKG_VERSION"));
return Ok(());
}
if options.flags.license {
println!("This is free and unencumbered software released into the public domain.");
return Ok(());
}
if options.flags.verbose > 0 || options.flags.debug {
}
match options.command.unwrap() {
#[cfg(feature = "beta")]
Command::Config {} => config::config(),
#[cfg(feature = "beta")]
Command::Check { paths } => check::check(paths),
Command::Execute {
block,
encoding,
params,
} => execute::execute(block, params, encoding),
#[cfg(feature = "beta")]
Command::Generate { path } => generate::generate(path),
}
}
fn parse_encoding(input: &str) -> Result<Encoding, execute::ExecuteError> {
input
.parse()
.map_err(|e: String| execute::ExecuteError::InvalidEncoding(e))
}
fn parse_kv_param<K, V>(input: &str) -> Result<(K, V), Box<dyn Error + Send + Sync + 'static>>
where
K: FromStr,
K::Err: Error + Send + Sync + 'static,
V: FromStr,
V::Err: Error + Send + Sync + 'static,
{
let split_pos = input
.find('=')
.ok_or_else(|| format!("invalid key=value parameter"))?;
Ok((input[..split_pos].parse()?, input[split_pos + 1..].parse()?))
}