Skip to content

Instantly share code, notes, and snippets.

@Coutlaw
Last active October 26, 2022 20:47
Show Gist options
  • Save Coutlaw/89dd16a5f7eb852c4ee44a3094bcdc09 to your computer and use it in GitHub Desktop.
Save Coutlaw/89dd16a5f7eb852c4ee44a3094bcdc09 to your computer and use it in GitHub Desktop.
Rustlings: Enums 1, 2 & 3 solution
// Enums 1 problem (doesn't compile)
#[derive(Debug)]
enum Message {
// TODO: define a few types of messages as used below
}
fn main() {
println!("{:?}", Message::Quit);
println!("{:?}", Message::Echo);
println!("{:?}", Message::Move);
println!("{:?}", Message::ChangeColor);
}
// Enums 1 solution, add enum types
#[derive(Debug)]
enum Message {
// TODO: define a few types of messages as used below
Quit,
Echo,
Move,
ChangeColor
}
fn main() {
println!("{:?}", Message::Quit);
println!("{:?}", Message::Echo);
println!("{:?}", Message::Move);
println!("{:?}", Message::ChangeColor);
}
// Enums 2 problem (doesn't compile)
#[derive(Debug)]
enum Message {
// TODO: define the different variants used below
}
impl Message {
fn call(&self) {
println!("{:?}", &self);
}
}
fn main() {
let messages = [
Message::Move{ x: 10, y: 30 },
Message::Echo(String::from("hello world")),
Message::ChangeColor(200, 255, 255),
Message::Quit
];
for message in &messages {
message.call();
}
}
// Enums 2 solution, enum types with defined type properties
#[derive(Debug)]
enum Message {
// TODO: define the different variants used below
Move{x: i32, y: i32}, // object struct
Echo(String), // String type
ChangeColor(i32, i32, i32), // tuple struct
Quit // no defined type
}
impl Message {
fn call(&self) {
println!("{:?}", &self);
}
}
fn main() {
let messages = [
Message::Move{ x: 10, y: 30 },
Message::Echo(String::from("hello world")),
Message::ChangeColor(200, 255, 255),
Message::Quit
];
for message in &messages {
message.call();
}
}
// Enums 3 problem (doesn't compile)
enum Message {
// TODO: implement the message variant types based on their usage below
}
struct Point {
x: u8,
y: u8
}
struct State {
color: (u8, u8, u8),
position: Point,
quit: bool
}
impl State {
fn change_color(&mut self, color: (u8, u8, u8)) {
self.color = color;
}
fn quit(&mut self) {
self.quit = true;
}
fn echo(&self, s: String) {
println!("{}", s);
}
fn move_position(&mut self, p: Point) {
self.position = p;
}
fn process(&mut self, message: Message) {
// TODO: create a match expression to process the different message variants
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_match_message_call() {
let mut state = State{
quit: false,
position: Point{ x: 0, y: 0 },
color: (0, 0, 0)
};
state.process(Message::ChangeColor(255, 0, 255));
state.process(Message::Echo(String::from("hello world")));
state.process(Message::Move{ x: 10, y: 15 });
state.process(Message::Quit);
assert_eq!(state.color, (255, 0, 255));
assert_eq!(state.position.x, 10);
assert_eq!(state.position.y, 15);
assert_eq!(state.quit, true);
}
}
// Enums 3 solution, implement enum types, and match experssion for struct impl
enum Message {
// TODO: implement the message variant types based on their usage below
ChangeColor(u8, u8, u8),
Echo(String),
Move{x: u8, y: u8},
Quit
}
struct Point {
x: u8,
y: u8
}
struct State {
color: (u8, u8, u8),
position: Point,
quit: bool
}
impl State {
fn change_color(&mut self, color: (u8, u8, u8)) {
self.color = color;
}
fn quit(&mut self) {
self.quit = true;
}
fn echo(&self, s: String) {
println!("{}", s);
}
fn move_position(&mut self, p: Point) {
self.position = p;
}
fn process(&mut self, message: Message) {
// TODO: create a match expression to process the different message variants
match message {
Message::ChangeColor(r, g, b) => self.change_color((r, g, b)),
Message::Echo(s) => self.echo(s),
Message::Move{x, y} => self.move_position(Point{x, y}),
Message::Quit => self.quit()
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_match_message_call() {
let mut state = State{
quit: false,
position: Point{ x: 0, y: 0 },
color: (0, 0, 0)
};
state.process(Message::ChangeColor(255, 0, 255));
state.process(Message::Echo(String::from("hello world")));
state.process(Message::Move{ x: 10, y: 15 });
state.process(Message::Quit);
assert_eq!(state.color, (255, 0, 255));
assert_eq!(state.position.x, 10);
assert_eq!(state.position.y, 15);
assert_eq!(state.quit, true);
}
}
@stevenarellano
Copy link

enum Message {
Move(Point),
Echo(String),
ChangeColor((u8, u8, u8)),
Quit,
}

struct Point {
x: u8,
y: u8,
}

struct State {
color: (u8, u8, u8),
position: Point,
quit: bool,
}

impl State {
fn change_color(&mut self, color: (u8, u8, u8)) {
self.color = color;
}

fn quit(&mut self) {
    self.quit = true;
}

fn echo(&self, s: String) {
    println!("{}", s);
}

fn move_position(&mut self, p: Point) {
    self.position = p;
}

fn process(&mut self, message: Message) {
    match message {
        Message::ChangeColor((r, g, b)) => self.change_color((r, g, b)),
        Message::Echo(s) => self.echo(s),
        Message::Move(p) => self.move_position(p),
        Message::Quit => self.quit(),
    }
}

}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn test_match_message_call() {
    let mut state = State {
        quit: false,
        position: Point { x: 0, y: 0 },
        color: (0, 0, 0),
    };
    state.process(Message::ChangeColor((255, 0, 255)));
    state.process(Message::Echo(String::from("hello world")));
    state.process(Message::Move(Point { x: 10, y: 15 }));
    state.process(Message::Quit);

    assert_eq!(state.color, (255, 0, 255));
    assert_eq!(state.position.x, 10);
    assert_eq!(state.position.y, 15);
    assert_eq!(state.quit, true);
}

}

@NiciTheNici
Copy link

NiciTheNici commented Jun 28, 2022

enum Message {
    // TODO: implement the message variant types based on their usage below
    ChangeColor((u8, u8, u8)),
    Echo(String),
    Move(Point),
    Quit,
}

Instead of passing the r, g, b values separately like you two above I used one variable "result"

    fn process(&mut self, message: Message) {
        // TODO: create a match expression to process the different message variants
        match message {
            Message::ChangeColor(result) => self.change_color(result),
            Message::Echo(result) => self.echo(result), 
            Message::Move(result) => self.move_position(result),
            Message::Quit => self.quit(),
            
        }
    }

Thanks for your solutions, they helped me a lot 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment