#![allow(incomplete_features)] #![feature(async_fn_in_trait)] #![feature(custom_inner_attributes)] #![feature(lint_reasons)] #![feature(never_type)] #![feature(once_cell)] #![deny(clippy::complexity)] #![deny(clippy::nursery)] #![deny(clippy::pedantic)] #![deny(clippy::perf)] #![deny(clippy::suspicious)] #![deny(clippy::alloc_instead_of_core)] #![deny(clippy::as_underscore)] #![deny(clippy::clone_on_ref_ptr)] #![deny(clippy::create_dir)] #![warn(clippy::dbg_macro)] #![deny(clippy::default_numeric_fallback)] #![deny(clippy::default_union_representation)] #![deny(clippy::deref_by_slicing)] #![deny(clippy::empty_structs_with_brackets)] #![deny(clippy::exit)] #![deny(clippy::filetype_is_file)] #![deny(clippy::fn_to_numeric_cast)] #![deny(clippy::format_push_string)] #![deny(clippy::get_unwrap)] #![deny(clippy::if_then_some_else_none)] #![allow( clippy::implicit_return, reason = "returns should be done implicitly, not explicitly" )] #![deny(clippy::indexing_slicing)] #![deny(clippy::large_include_file)] #![deny(clippy::let_underscore_must_use)] #![deny(clippy::lossy_float_literal)] #![deny(clippy::map_err_ignore)] #![deny(clippy::mem_forget)] #![deny(clippy::missing_docs_in_private_items)] #![deny(clippy::missing_trait_methods)] #![deny(clippy::mod_module_files)] #![deny(clippy::multiple_inherent_impl)] #![deny(clippy::mutex_atomic)] #![deny(clippy::needless_return)] #![deny(clippy::non_ascii_literal)] #![deny(clippy::panic_in_result_fn)] #![deny(clippy::pattern_type_mismatch)] #![deny(clippy::rc_buffer)] #![deny(clippy::rc_mutex)] #![deny(clippy::rest_pat_in_fully_bound_structs)] #![deny(clippy::same_name_method)] #![deny(clippy::separated_literal_suffix)] #![deny(clippy::str_to_string)] #![deny(clippy::string_add)] #![deny(clippy::string_slice)] #![deny(clippy::string_to_string)] #![allow( clippy::tabs_in_doc_comments, reason = "tabs are preferred for this project" )] #![deny(clippy::try_err)] #![deny(clippy::undocumented_unsafe_blocks)] #![deny(clippy::unnecessary_self_imports)] #![deny(clippy::unneeded_field_pattern)] #![deny(clippy::unwrap_in_result)] #![deny(clippy::unwrap_used)] #![warn(clippy::use_debug)] #![deny(clippy::verbose_file_reads)] #![deny(clippy::wildcard_dependencies)] #![deny(clippy::wildcard_enum_match_arm)] #![deny(missing_copy_implementations)] #![deny(missing_debug_implementations)] #![deny(missing_docs)] #![deny(single_use_lifetimes)] #![deny(unsafe_code)] #![deny(unused)] //! Brainfuck RS //! //! Brainfuck interpreter written in Rust use std::path::PathBuf; use brainf_rs::{ executor, utility::{execute_from_file, execute_from_str}, }; use clap::{Parser, Subcommand}; use miette::Context; /// Representation of command line application for the Brainfuck interpreter. #[derive(Parser)] #[command(author, version, about, long_about = None)] #[command(propagate_version = true)] struct App { /// Subcommands supported by the Brainfuck interpreter #[command(subcommand)] command: Command, } /// Implementation of subcommands for the Brainfuck interpreter. #[derive(Subcommand)] enum Command { /// Interprets Brainfuck code from a provided file. File { /// Path to the file to interpret with Brainfuck. path: PathBuf, }, /// Interprets Brainfuck code from a text input on the command line. Text { /// Text input to be interpreted as Brainfuck. input: String, }, } fn main() -> miette::Result<()> { let app = App::parse(); let mut tape = vec![0u8; 1024]; match app.command { Command::File { ref path } => { execute_from_file::(path, &mut tape) .wrap_err("when executing from file")?; } Command::Text { ref input } => execute_from_str::(input, &mut tape)?, }; Ok(()) }