aboutsummaryrefslogtreecommitdiff
path: root/examples/example-repl
diff options
context:
space:
mode:
authorWeicao-CatilGrass <1992414357@qq.com>2026-05-23 23:41:04 +0800
committerWeicao-CatilGrass <1992414357@qq.com>2026-05-23 23:49:34 +0800
commit0a2ef958c0dca21d19e4ffc38ba5a7c4078e182a (patch)
treec82fc4242ed393b132ba514eb434d722e7d9c387 /examples/example-repl
parentccab1940c019dfbfb7dfcbbe4cb927258933755f (diff)
Rework examples and add entry macro for testing
Diffstat (limited to 'examples/example-repl')
-rw-r--r--examples/example-repl/Cargo.lock84
-rw-r--r--examples/example-repl/Cargo.toml8
-rw-r--r--examples/example-repl/src/main.rs157
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 = &current_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!();