Return back to the "Use ncurses to Draw the Images" Page
/* main.rs */ mod images; mod housekeeping; use images::*; use housekeeping::*; fn main() { let opts: Options = get_options(); let image_vecvec = string_to_vecvecstrings(opts.image_string); display_image(image_vecvec); } // end of main() fn get_options() -> Options { use clap::Parser; // Use c[ommand] l[ine] a[rgument] p[arser] to get command-line arguments. // Set up program-arguments possibilities. #[derive(Parser)] struct Arguments { /// Which image to animate? D[51] | C[51] | L[ittle] | B[oat] | T[win[engine]] | P[lane] | M[otor[cycle]] | J[ack] | F[erris] #[arg(long, short, default_value_t = String::from("D51"))] kind: String, /// Fly? #[arg(short, long, default_value_t = false)] fly: bool, /// Ctrl-c? #[arg(short, long, default_value_t = false)] breakable: bool, /// Accident (only for some images)? #[arg(short, long, default_value_t = false)] accident: bool, /// No trailer (only for D51 & C51 trains)? #[arg(short, long, default_value_t = false)] no_trailer: bool, } // end of Arguments struct // The struct variable must be initialized; we're mostly using dummy values. let mut cli_opts = Options { kind: String::from("D51"), image_string: String::from(""), image_vecvec: vec![vec![String::from("")]], speed: 100, accident: false, fly: false, screen_height: 100, screen_width: 100, craft_height: 100, craft_length: 100, }; // Get command-line arguments, if any. let args: Arguments = Arguments::parse(); let image_string = match args.kind.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" => MOTORCYCLE, "J" | "JACK" => JACK, "F" | "FERRIS" | "MASCOT" => FERRIS, _ => D51, }; cli_opts.image_string = image_string.to_string(); return cli_opts; } // end of get_options() fn string_to_vecvecstrings(image_string: String) -> Vec<Vec<String>> { //The first character in the original const, after the 'r"', is a newline; lose it. let image_string = &image_string[1..image_string.len()]; // Create new blank vector of vector 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; // Create first inner vector in the outer vector. outer_vec.push(Vec::new()); for mut each_line in image_string.lines() { if each_line != "" { // If a blank line is not found ... // ... remove single-quote mark at end of each line, if &each_line[each_line.len() - 1..] == "'" { each_line = &each_line[0..each_line.len() - 1]; } // ... and then add the string to the current inner vector. outer_vec[inner_vec_num].push(each_line.to_string()); } else { // If a blank line is found... // ... we're done with the current vector, so create a new inner vector... outer_vec.push(Vec::new()); // ... and increase the count of vectors by one. inner_vec_num += 1; } } // Return the finished vector of String vectors. outer_vec } // end of string_to_vecvecstrings() 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()
/* housekeeping.rs */ pub struct Options { pub kind: String, pub speed: usize, pub image_string: String, pub image_vecvec: Vec<Vec<String>>, pub accident: bool, pub fly: bool, pub screen_height: usize, pub screen_width: usize, pub craft_height: usize, pub craft_length: usize, } // end of struct Options
/* images.rs */ /* Feel free to add your own images, and modify the rest of the program code accordingly. - 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. - If there are multiple frames/cels of the image, a blank line must separate the frames. - The single quotes at the end of the lines are optional; they merely serve as a visual indicator of the end of the line. Some of the image lines have the single quote; some do not. The program will strip them out if they are included here. - The "r" before the string tells the compiler to read the string in "raw" mode, so that backslashes are not interpreted as escape characters. - If a hash/splat ("#") is used in an image, the "r" must be modified to be "r#", and the end of the string must be closed with a "#". You can see this in both the TWINENGINE and MOTORCYCLE declarations. 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 June 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 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