diff options
| author | Weicao-CatilGrass <1992414357@qq.com> | 2026-05-23 23:41:04 +0800 |
|---|---|---|
| committer | Weicao-CatilGrass <1992414357@qq.com> | 2026-05-23 23:49:34 +0800 |
| commit | 0a2ef958c0dca21d19e4ffc38ba5a7c4078e182a (patch) | |
| tree | c82fc4242ed393b132ba514eb434d722e7d9c387 /examples/example-repl | |
| parent | ccab1940c019dfbfb7dfcbbe4cb927258933755f (diff) | |
Rework examples and add entry macro for testing
Diffstat (limited to 'examples/example-repl')
| -rw-r--r-- | examples/example-repl/Cargo.lock | 84 | ||||
| -rw-r--r-- | examples/example-repl/Cargo.toml | 8 | ||||
| -rw-r--r-- | examples/example-repl/src/main.rs | 157 |
3 files changed, 0 insertions, 249 deletions
diff --git a/examples/example-repl/Cargo.lock b/examples/example-repl/Cargo.lock deleted file mode 100644 index adde389..0000000 --- a/examples/example-repl/Cargo.lock +++ /dev/null @@ -1,84 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "example-repl" -version = "0.0.1" -dependencies = [ - "just_fmt", - "mingling", -] - -[[package]] -name = "just_fmt" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5454cda0d57db59778608d7a47bff5b16c6705598265869fb052b657f66cf05e" - -[[package]] -name = "mingling" -version = "0.1.9" -dependencies = [ - "mingling_core", - "mingling_macros", - "size", -] - -[[package]] -name = "mingling_core" -version = "0.1.9" -dependencies = [ - "just_fmt", -] - -[[package]] -name = "mingling_macros" -version = "0.1.9" -dependencies = [ - "just_fmt", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "proc-macro2" -version = "1.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "size" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b6709c7b6754dca1311b3c73e79fcce40dd414c782c66d88e8823030093b02b" - -[[package]] -name = "syn" -version = "2.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "unicode-ident" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" diff --git a/examples/example-repl/Cargo.toml b/examples/example-repl/Cargo.toml deleted file mode 100644 index 34b85e3..0000000 --- a/examples/example-repl/Cargo.toml +++ /dev/null @@ -1,8 +0,0 @@ -[package] -name = "example-repl" -version = "0.0.1" -edition = "2024" - -[dependencies] -mingling = { path = "../../mingling", features = ["repl", "parser"] } -just_fmt = "0.1.2" diff --git a/examples/example-repl/src/main.rs b/examples/example-repl/src/main.rs deleted file mode 100644 index 2d8d9b0..0000000 --- a/examples/example-repl/src/main.rs +++ /dev/null @@ -1,157 +0,0 @@ -use mingling::{ - REPL, - hook::ProgramHook, - prelude::*, - setup::{BasicREPLOutputSetup, BasicREPLPromptSetup, BasicREPLReadlineSetup}, - this, -}; -use std::{env::current_dir, path::PathBuf}; - -// Resource to store the current directory -#[derive(Clone)] -struct CurrentDir { - dir: PathBuf, -} - -impl Default for CurrentDir { - fn default() -> Self { - Self { - dir: current_dir().unwrap(), - } - } -} - -fn main() { - let mut program = ThisProgram::new(); - - // Add resource - program.with_resource(CurrentDir::default()); - - // Add dispatchers - program.with_dispatcher(ChangeDirectoryCommand); - program.with_dispatcher(ListCommand); - program.with_dispatcher(ExitCommand); - program.with_dispatcher(ClearCommand); - - // Add setups - program.with_setup(BasicREPLReadlineSetup); - program.with_setup(BasicREPLOutputSetup); - program.with_setup(BasicREPLPromptSetup::func(|| { - let res = this::<ThisProgram>().res::<CurrentDir>().unwrap(); - let dir_str: String = res.dir.to_string_lossy().into(); - let prompt = format!( - "{}> ", - dir_str - .replace(&['/', '\\'][..], ">") - .trim_start_matches('>') - .trim_end_matches('>') - ); - prompt - })); - - // Add hooks to handle REPL-related events - program.with_hook(ProgramHook::empty().on_repl_begin(|| { - // Print welcome message - println!("Welcome!") - })); - - // Start the REPL loop - program.exec_repl(); -} - -// Create error route -pack!(ErrorDirectoryNotExist = PathBuf); - -// Create commands: cd ls exit -dispatcher!("cd", ChangeDirectoryCommand => ChangeDirectoryEntry); -dispatcher!("ls", ListCommand => ListEntry); -dispatcher!("exit", ExitCommand => ExitEntry); -dispatcher!("clear", ClearCommand => ClearEntry); - -// Define data needed for the cd command's execution phase -pack!(StateChangeDirectory = String); - -// Define data needed for the ls command's rendering phase -pack!(ResultList = Vec<String>); - -// Parse cd command arguments -#[chain] -fn parse_cd_args(prev: ChangeDirectoryEntry) -> Next { - let join = prev.pick(()).unpack(); - StateChangeDirectory::new(join) -} - -// Execute directory change -#[chain] -fn handle_cd(prev: StateChangeDirectory, current_dir: &mut CurrentDir) -> Next { - let join = prev.inner; - let new_dir = just_fmt::fmt_path::fmt_path(current_dir.dir.join(join)).unwrap_or_default(); - - // If the path is not found, route to error handling - if !new_dir.exists() { - return ErrorDirectoryNotExist::new(new_dir).to_render(); - } - - current_dir.dir = new_dir; - empty_result!() -} - -// Get directory contents via the CurrentDir resource -#[chain] -fn handle_ls(_prev: ListEntry, current_dir: &CurrentDir) -> Next { - let dir = ¤t_dir.dir; - let entries: Vec<String> = std::fs::read_dir(dir) - .into_iter() - .flat_map(|rd| rd.filter_map(|e| e.ok())) - .map(|e| { - let name = e.file_name().to_string_lossy().to_string(); - if e.file_type().map(|t| t.is_dir()).unwrap_or(false) { - format!("{}/", name) - } else { - name - } - }) - .collect(); - - // Render ResultList - ResultList::new(entries).to_render() -} - -// Render ResultList data -#[renderer] -fn render_list(list: ResultList) { - for item in list.inner { - r_println!("{}", item) - } -} - -// Handle exit command event -#[chain] -fn handle_exit( - _prev: ExitEntry, - repl: &mut REPL, // Import REPL resource, registered in `exec_repl`, usable directly -) { - // Set the REPL exit flag; REPL will exit after this loop iteration - repl.exit = true; -} - -// Handle clear command event -#[chain] -fn handle_clear(_prev: ClearEntry) { - // Clear the terminal screen - print!("\x1B[2J\x1B[1;1H"); -} - -// Handle path not found event -#[renderer] -fn render_error_directory_not_exist(err: ErrorDirectoryNotExist) { - r_println!("Directory not found: {}", err.inner.display()) -} - -// Handle dispatcher not found event -#[renderer] -fn dispatcher_not_found(prev: DispatcherNotFound) { - r_println!("Command not found: \"{}\"", prev.join(", ")) -} - -gen_program!(); |
