diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-04-16 23:24:52 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-04-16 23:24:52 +0800 |
| commit | 6e36fc3707e791c3c748133d648957706b54fd3a (patch) | |
| tree | 3851ed69d60f331a803a6c19c97a56829a11f2f5 /src/cli | |
| parent | 363fbc6e98f832471a17a10ec18e8823df6a2ed5 (diff) | |
Add CLI commands for bill management and persistence
Diffstat (limited to 'src/cli')
| -rw-r--r-- | src/cli/calc_cmd.rs | 9 | ||||
| -rw-r--r-- | src/cli/consts.rs | 1 | ||||
| -rw-r--r-- | src/cli/dispatchers.rs | 12 | ||||
| -rw-r--r-- | src/cli/entry.rs | 21 | ||||
| -rw-r--r-- | src/cli/io_error.rs | 42 | ||||
| -rw-r--r-- | src/cli/ops_cmd.rs | 80 |
6 files changed, 0 insertions, 165 deletions
diff --git a/src/cli/calc_cmd.rs b/src/cli/calc_cmd.rs deleted file mode 100644 index 09f4e03..0000000 --- a/src/cli/calc_cmd.rs +++ /dev/null @@ -1,9 +0,0 @@ -// use mingling::macros::dispatcher; -// use mingling::{macros::chain, marker::NextProcess}; - -// use crate::cli::entry::*; - -// dispatcher!("calc", CalculateCommand => CalculateEntry); - -// #[chain] -// pub async fn parse_calc_entry(prev: CalculateEntry) -> NextProcess {} diff --git a/src/cli/consts.rs b/src/cli/consts.rs deleted file mode 100644 index 254b611..0000000 --- a/src/cli/consts.rs +++ /dev/null @@ -1 +0,0 @@ -pub const BILL_WORKSPACE_CONFIG_FILE: &str = "cobill.yml"; diff --git a/src/cli/dispatchers.rs b/src/cli/dispatchers.rs deleted file mode 100644 index 27b7747..0000000 --- a/src/cli/dispatchers.rs +++ /dev/null @@ -1,12 +0,0 @@ -use mingling::{Program, macros::program_setup}; - -use crate::ThisProgram; -use crate::cli::ops_cmd::{CreateCommand, InitHereCommand}; - -#[program_setup] -pub fn chaos_billing_setup(program: &mut Program<ThisProgram, ThisProgram>) { - program.with_dispatcher(InitHereCommand); - program.with_dispatcher(CreateCommand); - - // program.with_dispatcher(CalculateCommand); -} diff --git a/src/cli/entry.rs b/src/cli/entry.rs deleted file mode 100644 index e68b7b4..0000000 --- a/src/cli/entry.rs +++ /dev/null @@ -1,21 +0,0 @@ -use mingling::setup::GeneralRendererSetup; - -use crate::__completion_gen::CompletionDispatcher; -use crate::ThisProgram; -use crate::cli::dispatchers::*; - -pub async fn entry() { - let mut program = ThisProgram::new(); - - // Add Completion - program.with_dispatcher(CompletionDispatcher); - - // Add General Renderer - program.with_setup(GeneralRendererSetup); - - // Setup `cobill` - program.with_setup(ChaosBillingSetup); - - // Execute - program.exec().await; -} diff --git a/src/cli/io_error.rs b/src/cli/io_error.rs deleted file mode 100644 index 49b9939..0000000 --- a/src/cli/io_error.rs +++ /dev/null @@ -1,42 +0,0 @@ -use mingling::{ - Groupped, - macros::{r_println, renderer}, -}; -use serde::Serialize; - -use crate::ThisProgram; - -#[derive(Groupped)] -pub struct IOError { - inner: std::io::Error, -} - -impl IOError { - pub fn new(error: std::io::Error) -> Self { - Self { inner: error } - } -} - -impl From<std::io::Error> for IOError { - fn from(error: std::io::Error) -> Self { - Self::new(error) - } -} - -impl Serialize for IOError { - fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> - where - S: serde::Serializer, - { - use serde::ser::SerializeStruct; - let mut state = serializer.serialize_struct("IOError", 2)?; - state.serialize_field("kind", &self.inner.kind().to_string())?; - state.serialize_field("info", &self.inner.to_string())?; - state.end() - } -} - -#[renderer] -pub fn render_io_error(prev: IOError) { - r_println!("{}: {}", prev.inner.kind(), prev.inner.to_string()) -} diff --git a/src/cli/ops_cmd.rs b/src/cli/ops_cmd.rs deleted file mode 100644 index 4b0eea7..0000000 --- a/src/cli/ops_cmd.rs +++ /dev/null @@ -1,80 +0,0 @@ -use std::{ - env::current_dir, - fs::{self, create_dir_all}, - path::PathBuf, -}; - -use mingling::{ - AnyOutput, - macros::{chain, dispatcher, pack, r_println, renderer}, - marker::NextProcess, - parser::Picker, -}; - -use crate::{ - ThisProgram, - cli::{consts::BILL_WORKSPACE_CONFIG_FILE, io_error::IOError}, -}; - -dispatcher!("init", InitHereCommand => InitEntry); -dispatcher!("create", CreateCommand => CreateEntry); - -pack!(StateCreateWorkspace = PathBuf); - -#[chain] -pub async fn handle_init_command(_prev: InitEntry) -> NextProcess { - let current_dir = match current_dir() { - Ok(d) => d, - Err(e) => return AnyOutput::new(IOError::from(e)).route_renderer(), - }; - StateCreateWorkspace::new(current_dir).to_chain() -} - -#[chain] -pub async fn handle_create_command(prev: CreateEntry) -> NextProcess { - let path = pick_path(prev.inner); - StateCreateWorkspace::new(path).to_chain() -} - -#[chain] -pub async fn handle_state_create_workspace(prev: StateCreateWorkspace) -> NextProcess { - let dir = prev.inner; - let file = dir.join(BILL_WORKSPACE_CONFIG_FILE); - - match create_dir_all(&dir) { - Ok(d) => d, - Err(e) => return AnyOutput::new(IOError::from(e)).route_renderer(), - }; - - if file.exists() { - return AnyOutput::new(WorkspaceConfigAlreadyExists::new(dir)).route_renderer(); - } - - if let Err(e) = fs::write(file, "") { - return AnyOutput::new(IOError::from(e)).route_renderer(); - } - - StateWorkspaceCreated::new(dir).to_render() -} - -pack!(StateWorkspaceCreated = PathBuf); - -#[renderer] -pub fn render_workspace_created(prev: StateWorkspaceCreated) { - r_println!("Workspace created at: {:?}", prev.inner); -} - -pack!(WorkspaceConfigAlreadyExists = PathBuf); - -#[renderer] -pub fn render_workspace_config_already_exists(prev: WorkspaceConfigAlreadyExists) { - r_println!("Workspace config already exists: {:?}", prev.inner); -} - -fn pick_path(args: Vec<String>) -> PathBuf { - let path = Picker::<()>::new(args) - .pick::<String>(()) - .unpack_directly() - .0; - PathBuf::from(path) -} |
