Convert "sl" Source Code from C to Rust

Add the Little Train

In a previous lesson, we were able to Add the C51 Train, and in the last lesson, Create a Function to Read ASCII-art from Text File, we moved that code into a function to make it usable for other ASCII-art images. This should make it pretty trivial to add another train. Let's add the "Little" train.

Create a new file named "src/little.txt", and paste the following art (from the C-version of "sl"'s "sl.h" file) into the new "src/little.txt" file.

"src/little.txt"
"     ++      +------ ____                 ____________________ "
"     ||      |+-+ |  |   \@@@@@@@@@@@     |  ___ ___ ___ ___ | "
"   /---------|| | |  |    \@@@@@@@@@@@@@_ |  |_| |_| |_| |_| | "
"  + ========  +-+ |  |                  | |__________________| "
" _|--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)    "

Now, in "src/extras.rs", in the "draw_image()" function, make this little change:

"src/extras.rs"
...
    let image = match kind.as_str() {
        // Which image are we supposed to draw?
        "D51" => get_d51(),
        "C51" => get_image("./c51.txt"),
	"LITTLE" => get_image("./little.txt"),
        &_ => {
            // If the user enters an unknown image name (say, "racecar") ...
            println!(
                "Invalid kind. You entered '{}'; the default was used instead.",
                kind
            );
            get_d51()
        }
...

Give it a try -- cargo run -- --kind little --speed medium. It'll even fly if you tell it to!

Easy, no?

And what if you wanted to Add a Jumping Jack?