Return back to the "Use ncurses to Draw the Images" Page
#![allow(unused)] /* main.rs */ mod convert_to_vec; mod display; mod get_options; mod images; use convert_to_vec::str_to_vecvecstring; use display::display_image; use get_options::get_opts; fn main() { let (model_string, fly, oops, interruptible) = get_opts(); let model_vecvecstring = str_to_vecvecstring(&model_string); display_image(model_vecvecstring); println!("The option to fly = {}.", fly); // Temporary test of what we get back in "fly". println!("The Accident (\"oops\") option = {}.", oops); // Temporary test of what we get back in "oops". println!("The \"interruptible\" option {}.", interruptible); // Temporary test of what we get back in "interruptible". } // end of main()
/* get_options.rs */ pub fn get_opts() -> (String, bool, bool, bool { use clap::Parser; // Use c[ommand] l[ine] a[rgument] p[arser] to get command-line arguments. use crate::images::*; // Set up program-argument possibilities. #[derive(Parser)] struct Arguments { /// Which model should be used? #[arg(long,short, default_value_t = String::from("D51"))] model: String, /// Should the model fly? #[arg(long, short, default_value_t = false)] fly: bool, /// Accident? #[arg(long, short, default_value_t = false)] oops: bool, /// Interrupt program-run? #[arg(long, short, default_value_t = false)] interruptable: bool, } // end of Arguments struct definition // Get arguments from command-line, if any. let args: Arguments = Arguments::parse(); // Process "model" option. let image_str = match args.model.to_uppercase().as_str() { "P" | "PLANE" => PLANE, "D" | "D51" => D51, "C" | "C51" => C51, "L" | "LITTLE" => LITTLE, "B" | "BOAT" => BOAT, "T" | "TWIN" | "TWINENGINE" => TWINENGINE, "M" | "MOTOR" | "MOTORCYCLE" | "CYCLE" => MOTORCYCLE, "J" | "JACK" => JACK, "F" | "FERRIS" | "MASCOT" => FERRIS, _ => D51, }; // Process "fly" option. let mut fly: bool = false; if args.fly { fly = true; } else { fly = false; } // Process Accident ("oops") option. let mut oops: bool = false; if args.oops { oops = true; } else { oops = false; } // Process "interruptible" option. let mut interruptible: bool = false; if args.interruptible { interruptible = true; } else { interruptible = false; } return (image_str.to_string(), fly, oops, interruptible); } // end of get_options()
/* convert_to_vec.rs */ pub fn str_to_vecvecstring(incoming_str: &str) -> Vec<Vec<String>> { //The first character in the original const, after the 'r"', is a newline; lose it. let image_str: &str = &incoming_str[1..]; // Create new empty vector of vectors of Strings. let mut outer_vec: Vec<Vec<String>> = Vec::new(); // This keeps track of which frame/inner vector we're processing. let mut inner_vec_num: usize = 0; // We'll start with the first one. // Create a first new inner vector into the outer vector. outer_vec.push(Vec::new()); for mut each_line in image_str.lines() { // Cycle through each line of the image_str image. if each_line == "" { // If the line is a blank line ... // ... we're starting a new frame, so create a new inner vector... outer_vec.push(Vec::new()); // ... and increase the count of vectors by one. inner_vec_num += 1; } else { // The line is not blank, so process it as part of the current frame. if &each_line[each_line.len() - 1..] == "'" { // If end of line is a single-quote ... each_line = &each_line[0..each_line.len() - 1]; // ... remove it. } // Now add the non-blank line to the current inner vector. outer_vec[inner_vec_num].push(each_line.to_string()); } // Then move on to the next loop/line. } // Return the finished vector of String vectors. outer_vec } // end of str_to_vecvecstring()
/* display.rs */ pub fn display_image(image_vecvec: Vec<Vec<String>>) { let mut frame_num = 0; for each_frame in image_vecvec { println!("Frame {}:", frame_num); for each_line in each_frame { println!("{}", each_line); } frame_num += 1; } } // end of display_image()
/* images.rs */ /* - Each frame of an image must be separated from the next by a blank line. - Single-quotes are optional at the end of a frame's lines, but help to see where is the right edge. - Ideally all the lines of all the frames of a particular image should be of the same length. But if not, the first line of the first frame should be the longest, as that's the line the program uses to determine an image's length. - The "r" before the string tells the compiler to read the string in "raw" mode, so that backslashes are not interpreted as escape characters. Original Copyright Notice from "sl.h" in the "sl" package of Debian Bookworm: /*======================================== * sl.h: SL version 5.02 * Copyright 1993,2002,2014 * Toyoda Masashi * (mtoyoda@acm.org) * Last Modified: 2014/06/03 *======================================== */ This Rust re-write by: Kent West - kent.west@gmail.com July 2023 */ pub const D51: &str = r" ==== ________ ___________' _D _| |_______/ \__I_I_____===__|_________|' |(_)--- | H\________/ | | =|___ ___| ' / | | H | | | | ||_| |_|| ' | | | H |__--------------------| [___] | ' | ________|___H__/__|_____/[][]~\_______| | ' |/ | |-----------I_____I [][] [] D |=======|__' __/ =| o |=-~~\ /~~\ /~~\ /~~\ ____Y___________|__' |/-=|___|= || || || |_____/~\___/ ' \_/ \O=====O=====O=====O_/ \_/ ' ==== ________ ___________ _D _| |_______/ \__I_I_____===__|_________| |(_)--- | H\________/ | | =|___ ___| / | | H | | | | ||_| |_|| | | | H |__--------------------| [___] | | ________|___H__/__|_____/[][]~\_______| | |/ | |-----------I_____I [][] [] D |=======|__ __/ =| o |=-~~\ /~~\ /~~\ /~~\ ____Y___________|__ |/-=|___|=O=====O=====O=====O |_____/~\___/ \_/ \__/ \__/ \__/ \__/ \_/ ==== ________ ___________' _D _| |_______/ \__I_I_____===__|_________|' |(_)--- | H\________/ | | =|___ ___| ' / | | H | | | | ||_| |_|| ' | | | H |__--------------------| [___] | ' | ________|___H__/__|_____/[][]~\_______| | ' |/ | |-----------I_____I [][] [] D |=======|__' __/ =| o |=-O=====O=====O=====O \ ____Y___________|__' |/-=|___|= || || || |_____/~\___/ ' \_/ \__/ \__/ \__/ \__/ \_/ ' ==== ________ ___________ _D _| |_______/ \__I_I_____===__|_________| |(_)--- | H\________/ | | =|___ ___| / | | H | | | | ||_| |_|| | | | H |__--------------------| [___] | | ________|___H__/__|_____/[][]~\_______| | |/ | |-----------I_____I [][] [] D |=======|__ __/ =| o |=-~O=====O=====O=====O\ ____Y___________|__ |/-=|___|= || || || |_____/~\___/ \_/ \__/ \__/ \__/ \__/ \_/ ==== ________ ___________' _D _| |_______/ \__I_I_____===__|_________|' |(_)--- | H\________/ | | =|___ ___| ' / | | H | | | | ||_| |_|| ' | | | H |__--------------------| [___] | ' | ________|___H__/__|_____/[][]~\_______| | ' |/ | |-----------I_____I [][] [] D |=======|__' __/ =| o |=-~~\ /~~\ /~~\ /~~\ ____Y___________|__' |/-=|___|= O=====O=====O=====O|_____/~\___/ ' \_/ \__/ \__/ \__/ \__/ \_/ ' ==== ________ ___________ _D _| |_______/ \__I_I_____===__|_________| |(_)--- | H\________/ | | =|___ ___| / | | H | | | | ||_| |_|| | | | H |__--------------------| [___] | | ________|___H__/__|_____/[][]~\_______| | |/ | |-----------I_____I [][] [] D |=======|__ __/ =| o |=-~~\ /~~\ /~~\ /~~\ ____Y___________|__ |/-=|___|= || || || |_____/~\___/ \_/ \_O=====O=====O=====O/ \_/ "; pub const LITTLE: &str = r" ++ +------ ____ ____________________ ' || |+-+ | | \@@@@@@@@@@@ | ___ ___ ___ ___ | ' /---------|| | | | \@@@@@@@@@@@@@_ | |_| |_| |_| |_| | ' + ======== +-+ | | | |__________________| ' _|--O========O~\-+ |__________________| |__________________| ' //// \_/ \_/ (O) (O) (O) (O) ' ++ +------ ____ ____________________ ' || |+-+ | | \@@@@@@@@@@@ | ___ ___ ___ ___ | ' /---------|| | | | \@@@@@@@@@@@@@_ | |_| |_| |_| |_| | ' + ======== +-+ | | | |__________________| ' _|--/O========O\-+ |__________________| |__________________| ' //// \_/ \_/ (O) (O) (O) (O) ' ++ +------ ____ ____________________ ' || |+-+ | | \@@@@@@@@@@@ | ___ ___ ___ ___ | ' /---------|| | | | \@@@@@@@@@@@@@_ | |_| |_| |_| |_| | ' + ======== +-+ | | | |__________________| ' _|--/~O========O-+ |__________________| |__________________| ' //// \_/ \_/ (O) (O) (O) (O) ' ++ +------ ____ ____________________ ' || |+-+ | | \@@@@@@@@@@@ | ___ ___ ___ ___ | ' /---------|| | | | \@@@@@@@@@@@@@_ | |_| |_| |_| |_| | ' + ======== +-+ | | | |__________________| ' _|--/~\------/~\-+ |__________________| |__________________| ' //// \_O========O (O) (O) (O) (O) ' ++ +------ ____ ____________________ ' || |+-+ | | \@@@@@@@@@@@ | ___ ___ ___ ___ | ' /---------|| | | | \@@@@@@@@@@@@@_ | |_| |_| |_| |_| | ' + ======== +-+ | | | |__________________| ' _|--/~\------/~\-+ |__________________| |__________________| ' //// \O========O/ (O) (O) (O) (O) ' ++ +------ ____ ____________________ ' || |+-+ | | \@@@@@@@@@@@ | ___ ___ ___ ___ | ' /---------|| | | | \@@@@@@@@@@@@@_ | |_| |_| |_| |_| | ' + ======== +-+ | | | |__________________| ' _|--/~\------/~\-+ |__________________| |__________________| ' //// O========O_/ (O) (O) (O) (O) ' "; // end of LITTLE pub const C51: &str = r" ___ ' _|_|_ _ __ __ ___________' D__/ \_(_)___| |__H__| |_____I_Ii_()|_________|' | `---' |:: `--' H `--' | |___ ___| ' +|~~~~~~~~++::~~~~~~~H~~+=====+~~~~~~|~~||_| |_|| ' || | :: H +=====+ | |:: ...| ' | | _______|_::-----------------[][]-----| | ' | /~~ || |-----/~~~~\ /[I_____I][][] --|||_______|__' ------'|oOo|==[]=- || || | ||=======_|__' /~\____|___|/~\_| O=======O=======O |__|+-/~\_| ' \_/ \_/ \____/ \____/ \____/ \_/ ' ___ ' _|_|_ _ __ __ ___________' D__/ \_(_)___| |__H__| |_____I_Ii_()|_________|' | `---' |:: `--' H `--' | |___ ___| ' +|~~~~~~~~++::~~~~~~~H~~+=====+~~~~~~|~~||_| |_|| ' || | :: H +=====+ | |:: ...| ' | | _______|_::-----------------[][]-----| | ' | /~~ || |-----/~~~~\ /[I_____I][][] --|||_______|__' ------'|oOo|===[]=- || || | ||=======_|__' /~\____|___|/~\_| O=======O=======O |__|+-/~\_| ' \_/ \_/ \____/ \____/ \____/ \_/ ' ___ ' _|_|_ _ __ __ ___________' D__/ \_(_)___| |__H__| |_____I_Ii_()|_________|' | `---' |:: `--' H `--' | |___ ___| ' +|~~~~~~~~++::~~~~~~~H~~+=====+~~~~~~|~~||_| |_|| ' || | :: H +=====+ | |:: ...| ' | | _______|_::-----------------[][]-----| | ' | /~~ || |-----/~~~~\ /[I_____I][][] --|||_______|__' ------'|oOo|===[]=- O=======O=======O | ||=======_|__' /~\____|___|/~\_| || || |__|+-/~\_| ' \_/ \_/ \____/ \____/ \____/ \_/ ' ___ ' _|_|_ _ __ __ ___________' D__/ \_(_)___| |__H__| |_____I_Ii_()|_________|' | `---' |:: `--' H `--' | |___ ___| ' +|~~~~~~~~++::~~~~~~~H~~+=====+~~~~~~|~~||_| |_|| ' || | :: H +=====+ | |:: ...| ' | | _______|_::-----------------[][]-----| | ' | /~~ || |-----/~~~~\ /[I_____I][][] --|||_______|__' ------'|oOo|==[]=- O=======O=======O | ||=======_|__' /~\____|___|/~\_| || || |__|+-/~\_| ' \_/ \_/ \____/ \____/ \____/ \_/ ' ___ ' _|_|_ _ __ __ ___________' D__/ \_(_)___| |__H__| |_____I_Ii_()|_________|' | `---' |:: `--' H `--' | |___ ___| ' +|~~~~~~~~++::~~~~~~~H~~+=====+~~~~~~|~~||_| |_|| ' || | :: H +=====+ | |:: ...| ' | | _______|_::-----------------[][]-----| | ' | /~~ || |-----/~~~~\ /[I_____I][][] --|||_______|__' ------'|oOo|=[]=- O=======O=======O | ||=======_|__' /~\____|___|/~\_| || || |__|+-/~\_| ' \_/ \_/ \____/ \____/ \____/ \_/ ' ___ ' _|_|_ _ __ __ ___________' D__/ \_(_)___| |__H__| |_____I_Ii_()|_________|' | `---' |:: `--' H `--' | |___ ___| ' +|~~~~~~~~++::~~~~~~~H~~+=====+~~~~~~|~~||_| |_|| ' || | :: H +=====+ | |:: ...| ' | | _______|_::-----------------[][]-----| | ' | /~~ || |-----/~~~~\ /[I_____I][][] --|||_______|__' ------'|oOo|=[]=- || || | ||=======_|__' /~\____|___|/~\_| O=======O=======O |__|+-/~\_| ' \_/ \_/ \____/ \____/ \____/ \_/ ' "; // end of C51 pub const BOAT: &str = r" |\ ' | \ ' | \ ' |___\ ' \--|----/ ' \_____/ ' "; // end of BOAT // This string uses double-quotes, so we have to wrap it in #""# instead of just "". pub const TWINENGINE: &str = r#" .____ __ _ __o__ _______ _ _ _ / / \ ~\ / / \ '\ ..../ .' . ' ' . ~\ ' / / . | . ~ \ .+~\~ ~ ' ' " " ' ' ~ - - - - - -''_ / . <# . - - -/' . ' \ __ '~ - \ .. - ~-.._ / |__| ( ) ( ) ( ) 0 o _ _ ~ . .-' .- ~ '-. -. < . ~ ' ' . . - ~ ~ -.__~_. _ _ ~- . N121PP . / . . . . ,- ~ ' ~ - - - - =. <#> . \.._ . ~ ____ _ .. .. .- . . / ' ~ -. ~ -. ' . . ' ~ - . ~-. ~ - . ~ . ~ -...0..~. ____ .____ __ _ __o__ _______ _ _ _ / / \ ~\ / / \ '\ ..../ .' . ' ' . ~\ ' / / . _ . ~ \ .+~\~ ~ ' ' " " ' ' ~ - - - - - -''_ / . <# -. - - -/' . ' \ __ '~ - \ .. - ~-.._ / |__| ( ) ( ) ( ) 0 o _ _ ~ . .-' .- ~ '-. -. < . ~ ' ' . . - ~ ~ -.__~_. _ _ ~- . N121PP . . . . . ,- ~ ' ~ - - - - =. - <#> - . \.._ . ~ ____ _ .. .. .- . . ' ~ -. ~ -. ' . . ' ~ - . ~-. ~ - . ~ . ~ -...0..~. ____ .____ __ _ __o__ _______ _ _ _ / / \ ~\ / / \ '\ ..../ .' . ' ' . ~\ ' / / . / . ~ \ .+~\~ ~ ' ' " " ' ' ~ - - - - - -''_ / . -<# . - - -/' . ' \ __ '~ - \ .. - ~-.._ / |__| ( ) ( ) ( ) 0 o _ _ ~ . .-' .- ~ '-. -. < . ~ ' ' . . - ~ ~ -.__~_. _ _ ~- . N121PP . \ . . . . ,- ~ ' ~ - - - - =. <#> . \.._ . ~ ____ _ .. .. .- . . \ ' ~ -. ~ -. ' . . ' ~ - . ~-. ~ - . ~ . ~ -...0..~. ____ .____ __ _ __o__ _______ _ _ _ / / \ ~\ / / \ '\ ..../ .' . ' ' . ~\ ' / / . _ . ~ \ .+~\~ ~ ' ' " " ' ' ~ - - - - - -''_ / . <# -. - - -/' . ' \ __ '~ - \ .. - ~-.._ / |__| ( ) ( ) ( ) 0 o _ _ ~ . .-' .- ~ '-. -. < . ~ ' ' . . - ~ ~ -.__~_. _ _ ~- . N121PP . . . . . ,- ~ ' ~ - - - - =. - <#> - . \.._ . ~ ____ _ .. .. .- . . ' ~ -. ~ -. ' . . ' ~ - . ~-. ~ - . ~ . ~ -...0..~. ____ "#; // end of TWINENGINE pub const PLANE: &str = r" ____ _ ' | __\_\_o____/_| ' <[___\_\_-----< ' | o' ' ' ' ____ _ ' / __\_\_o____/_| ' <[___\_\_-----< ' \ o' ' ' ' ____ _ ' | __\_\_o____/_| ' <[___\_\_-----< ' | o' ' ' ' ____ _ ' \ __\_\_o____/_| ' <[___\_\_-----< ' / o' ' ' ' "; // end of PLANE pub const MOTORCYCLE: &str = r#" _ ' ,S/ .e.##ee ' ,SS/_ /#####"" ' ,SSSSSS`|##| ' ,'|SSSSSS/%##| ' | ;SSSSS/%%%/ .-""-._ __..ooo._.sSSSSSSSSS"7. ' |/SSSSS/%%%/.' `._ __ _.od888888888888"' '"SSSSS" ' ___ `"SSS/%%%/"-.,sSSs._ 8888o._ __.o888888888""SS"" `-._ `7Sb ' _.sssSSSSSSSSSSS/`%%/ ,sSSSSSSSSS-.888888888888888888888"'.S" ,SSS"" `7b ' ,+"" ```""SS/%%./,sSSSSSSSS". `"888888888888888"'.sSS" ,SS"' `S.' /%%%/sSSSSSSSS" `s. `"88888888"'.sSSSS" ,S"' 7' /%%%/ `SSSSSSS$$,..sSS`-. `"88'.sSSSSSSSS._ ,-' ' /%%%/ `SSSS$$$$SSS",\\\`-. `"SSSSSS" 8"""7.-' ' /`%/ `SS$$$SSS,dP,s.\\//`-. `SS" ,'`8 ,ee888888ee. ' ,oo8888oo/ / `"""",d88Pd8888./,-'/`. `,-._`d' ,d88888888888888b. ' ,d888888888/ /8b. d8888Pd8888888bd88b`. :_._`8 ,888888"' '""88888. ' ,888P' / /"888b. d88888`8888888Pd8888 : :_`-.( ,d8888.__ 7888b. ' d88P / / `788b (88888:. `8888Pd88888 ; ; `-._ 8888P_Z_.>-""--.._ `8888 ' d88' ,--/ / `88b `88888b`. `8P 78888"; ; `"*88_," s88s. `888b ' d88' ,',$/ /$$$$. `88b `8888b `. `"'88"_/_,'`-._ `-.d8"88"8P. `888.' 888 ; ,$$$$$$$$$' 888 `"8' `---------------`-.._ 8888888888 888'' 888 : `$$$$$$$': 888 '888b`-._8s888888"P .888'' 788. ` `$$$$' ; 88P 8888. "8878888P' d888 ' 88b `. `"' ,' d88' '888b '88s8"' .d888' ' `88b. `-..-' d88' '888b. .dd888' ' 788b. ,888' 7888b._ _.d8888P ' `7888oo..__..oo888' `"8888888888888888"' ' `"7888888888P"' `"788 mGk 8P"' ' "#; // end of MOTORCYCLE pub const JACK: &str = r" \ 0 / ' \|/ ' | ' / \ ' _/ \_ ' ' __0__ ' / | \ ' / \ ' _\ /_ ' ' o ' /\ /\ ' |/ \| ' _\ /_ ' ' __0__ ' / | \ ' / \ ' _\ /_ ' "; // end of JACK pub const COALCAR: &str = r" ' ' ' _________________ ' _| \_____A ' =| | ' -| | ' __|________________________|_ ' |__________________________|_ ' |_D__D__D_| |_D__D__D_| ' \_/ \_/ \_/ \_/ ' "; // end of COALCAR pub const FERRIS: &str = r" _~^~^~_ ' \) / o o \ (/' \'_ - _'/ ' | '-----' | ' "; // end of FERRIS