Convert "sl" Source Code from C to Rust

Return to "Get User-provided Options from the Command-line.

Full Code Listing up to the "Get User-Provided Options from the Command-line" Page

main.rs
/* main.rs */

mod images;

use images::*;
use std::collections::HashMap;

fn main() {
    // Our choice of image kind is ...
    // let kind = "D51";
    // let kind = "LITTLE";
    // let kind = "C51";
    // let kind = "BOAT";
    // let kind = "TWINENGINE";
    // let kind = "PLANE";
    let kind = "MOTORCYCLE";
    // let kind = "JACK";
    // let kind = "COALCAR";
    // let kind = "FERRIS";

    let image_vecvec = get_image(kind);
    draw_image(image_vecvec);
} // end of main()

fn draw_image(image_vecvec: Vec<Vec<String>>) {
    for each_vec in image_vecvec {
        for each_line in each_vec {
            println!("{}", each_line);
        }
    }
} // end of draw_image()

fn get_image(kind: &str) -> Vec<Vec<String>> {
    // Our string is stored in a constant in the "images.rs" file.

    // Build a hashmap.
    let image_str: HashMap<&str, &str> = HashMap::from([
        ("D51", D51), // Maps the string "D51" to the constant D51 stored in "images.rs".
        ("LITTLE", LITTLE),
        ("C51", C51),
        ("BOAT", BOAT),
        ("TWINENGINE", TWINENGINE),
        ("PLANE", PLANE),
        ("MOTORCYCLE", MOTORCYCLE),
        ("JACK", JACK),
        ("COALCAR", COALCAR),
        ("FERRIS", FERRIS),
    ]);

    // Find our choice in the hashmap.
    let const_str = image_str.get(kind).unwrap();

    //The first character in the string, after the 'r"', is a newline; lose it.
    let image_string = &const_str[1..const_str.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 get_image()
images.rs
/* 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.
    - The "r" before the string tells the compiler to read the string in "raw"
        mode, so that backslashes are not interpreted as escape characters.
    - Put an entry for your new image into the "Build a hashmap" section of the "get_image()"
        function.

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
  April 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

Return to "Get User-provided Options from the Command-line.